Spring框架annotation实现IOC介绍
Spring学习笔记(三)
续Spring 学习笔记(二)之后,对Spring框架的annotation实现方法进行整理
本文目录
@Autowire
1 @Autowire+@Qualifier tips
2 myeclipse content小技巧
@Resource
1@Resource(name,type)
2与@Autowire的区别 按名字和按类型
@Component
1@Resource+@Component
2@Resource(NAME)+@Component(NAME)
@scope
@PostConstruct and @PreDestroy
annotation实现的Spring XML配置
1 查询文档http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
注意
1 http://www.springframework.org/schema/context/spring-context.xsd 找到所在的文件位置并添加到中xml catalog

2 写上 <context:annotation-config/> 表示启用annotation配置
3 介绍@Resource与@Autowire(通常使用@Resource)
1 @Resource与@Autowire的区别在于,Resource先是按照名字查找,然后再按照类型查找,
Autowire按照类型查找
2 通常我们只使用@Resource就可以了。
3 @Resource的语法
@Resource(name="userDaoImpl") 如果不指定name则按照set的参数的名字来查找,一般情况下建议指定NAME的值,便于对多种实现进行明确定位
UserServiceImpl
package com.serviceImpl; import javax.annotation.Resource;
import com.dao.UserDao;
import com.entity.User;
public class UserServiceImpl { private UserDao userDao; public void add(User user) {
userDao.save(user);
}
public void update(User user) {
userDao.update(user);
} public void init() {// 初始方法
System.out.println("init");
} public void destroy() {// 销毁方法
System.out.println("destory");
} public UserDao getUserDao() {
return userDao;
} @Resource(name="userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
再来看配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean name="userDaoImpl" class="com.daoImpl.UserDaoImpl"/>
<bean name="userDaoImpl2" class="com.daoImpl.UserDaoImpl2"/> <bean name="userServiceImpl" class="com.serviceImpl.UserServiceImpl">
<!-- <property name="userDao" ref="userDaoImpl"></property> 使用了@Resource与@Autowire之后这一行就可以不用写了-->
</bean> </beans>
测试类
package com.serviceImpl.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.entity.User;
import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest {
User user; @Before
public void setUp() throws Exception {
user = new User();
user.setName("testName");
user.setRemark("testRemark");
} @Test
public void testAdd() {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl");
UserServiceImpl.add(user);//调用方法
UserServiceImpl.update(user);//调用方法
} }
执行结果
testName-->testRemark save --调用UserDaoImpl!
testName-->testRemark update --调用UserDaoImpl!
TIPS:如果按@不出现提示怎么办?
在Myeclipse 中的JAVA editor中配置一下即可

4 @Component介绍
1 Component是组件化的注解对整个类进行初始化时使用
2 @Component的语法
Component注释位于类的上方,Component(NAME)用于指定名字,不指定则用类名(第一个首字母小写)
package com.daoImpl;
import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Component
public class UserDaoImpl implements UserDao{ public void save(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" save --调用UserDaoImpl!");
} public void update(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" update --调用UserDaoImpl!");
}
}
@Component需要在XML里配置搜索带有@Component注解路径
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/>
<context:component-scan base-package="com.daoImpl"></context:component-scan> <!-- 配置component路径,如果配置根目录会很方便,不过初始化速度会有点影响-->
<bean name="userDaoImpl2" class="com.daoImpl.UserDaoImpl2"/> <bean name="userServiceImpl" class="com.serviceImpl.UserServiceImpl">
<!-- <property name="userDao" ref="userDaoImpl"></property> 使用了@Resource与@Autowire之后这一行就可以不用写了-->
</bean> </beans>
3 让我们把所有的类全部配上,这样XML里会少很多内容
package com.serviceImpl; import javax.annotation.Resource; import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Component
public class UserServiceImpl { private UserDao userDao; public void add(User user) {
userDao.save(user);
}
public void update(User user) {
userDao.update(user);
} public void init() {// 初始方法
System.out.println("init");
} public void destroy() {// 销毁方法
System.out.println("destory");
} public UserDao getUserDao() {
return userDao;
} @Resource(name="userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
package com.daoImpl;
import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Component
public class UserDaoImpl implements UserDao{ public void save(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" save --调用UserDaoImpl!");
} public void update(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" update --调用UserDaoImpl!");
}
}
package com.daoImpl; import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Component
public class UserDaoImpl2 implements UserDao{ public void save(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" save --调用UserDaoImpl2!");
} public void update(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" update --调用UserDaoImpl2!");
}
}
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/>
<context:component-scan base-package="com.daoImpl"></context:component-scan> <!-- 配置component路径,如果配置根目录会很方便,不过初始化速度会有点影响-->
<context:component-scan base-package="com.serviceImpl"></context:component-scan> <!-- <bean name="userDaoImpl2" class="com.daoImpl.UserDaoImpl2"/> 使用了component配置这个不需要了 --> <!-- <bean name="userServiceImpl" class="com.serviceImpl.UserServiceImpl"> 使用了component配置这个不需要了 -->
<!-- <property name="userDao" ref="userDaoImpl"></property> 使用了@Resource与@Autowire之后这一行就可以不用写了-->
<!-- </bean>--> </beans>
测试类
package com.serviceImpl.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.entity.User;
import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest {
User user; @Before
public void setUp() throws Exception {
user = new User();
user.setName("testName");
user.setRemark("testRemark");
} @Test
public void testAdd() {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl");
UserServiceImpl.add(user);//调用方法
UserServiceImpl.update(user);//调用方法
} }
执行结果
testName-->testRemark save --调用UserDaoImpl!
testName-->testRemark update --调用UserDaoImpl!
总结@Component与@Resource
1 Component是定义初始化的类,相当于<bean />里的配置,且必须在XML里配置初始化component的搜索范围
2 @Resource是定义<bean></bean>里的<proptity >里的配置
3 两者结合的时候,开发速度能够明显加快,毕竟代码量少了很多
4 @scope
1 在类的上面配置
package com.serviceImpl; import javax.annotation.Resource; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Scope("singleton")
@Component
public class UserServiceImpl { private UserDao userDao; public void add(User user) {
userDao.save(user);
}
public void update(User user) {
userDao.update(user);
} public void init() {// 初始方法
System.out.println("init");
} public void destroy() {// 销毁方法
System.out.println("destory");
} public UserDao getUserDao() {
return userDao;
} @Resource(name="userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
执行效果不再演示
总结@scope
1 相当于在bean的类上面配置了scope,执行结果可参考笔记(一)
5@PostConstruct and @PreDestroy
package com.serviceImpl; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import com.dao.UserDao;
import com.entity.User;
@Scope("singleton")
@Component
public class UserServiceImpl { private UserDao userDao; public void add(User user) {
userDao.save(user);
}
public void update(User user) {
userDao.update(user);
}
@PostConstruct
public void init() {// 初始方法
System.out.println("init");
}
@PreDestroy
public void destroy() {// 销毁方法
System.out.println("destory");
} public UserDao getUserDao() {
return userDao;
} @Resource(name="userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
执行结果
init
testName-->testRemark save --调用UserDaoImpl!
testName-->testRemark update --调用UserDaoImpl!
destory
总结@PostConstruct and @PreDestroy
1 相当于在bean的类上面配置了init-method,和destroy-method,在annotation里面配置则是在bean类的方法上配置即可
通过本文可以了解
@Autowire
1 @Autowire+@Qualifier tips
2 myeclipse content小技巧
@Resource
1@Resource(name,type)
2与@Autowire的区别 按名字和按类型
@Component
1@Resource+@Component
2@Resource(NAME)+@Component(NAME)
@scope
@PostConstruct and @PreDestroy
Spring框架annotation实现IOC介绍的更多相关文章
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
- Spring升级案例之IOC介绍和依赖注入
Spring升级案例之IOC介绍和依赖注入 一.IOC的概念和作用 1.什么是IOC 控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容 ...
- Spring框架学习之IOC(一)
Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- spring框架学习(一)——IOC/DI
什么是Spring框架: Spring是一个基于IOC和AOP的结构J2EE系统的框架: IOC 反转控制 是Spring的基础,Inversion Of Control,简单说就是创建对象由以前的程 ...
- Spring基于 Annotation 的简单介绍
tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial"> 1.使用 @ ...
- Spring框架中的IOC?
Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...
- Spring框架各模块功能介绍
一. Spring是什么? Spring由Rod johnson开发: 是一个非常活跃的开源框架: 它帮助分离项目组件(对象)之间的依赖关系: 它的主要目的是简化企业开发 二. Spring的核心概念 ...
- Spring框架系列(四)--IOC控制反转和DI依赖注入
背景: 如果对象的引用或者依赖关系的管理由具体对象完成,代码的耦合性就会很高,代码测试也变得困难.而IOC可以很好的解决这个问题,把这 些依赖关系交给框架或者IOC容器进行管理,简化了开发. IOC是 ...
随机推荐
- openstack RuntimeError: Unable to create a new session key. It is likely that the cache
[Mon Apr 15 01:02:31.654247 2019] [:error] [pid 19433:tid 139790082479872] Login successful for user ...
- Python判断一个数是否为小数
一.判断一个数是否为小数 1.有且仅有一个小数点 2.小数点的左边可能为正数或负数 3.小数点的右边为正数 二.实现代码 def is_float(str): if str.count('.') == ...
- 关于请求时状态为cancel
项目中发现有一个问题,在我发送某些请求的时候请求一会状态就变为cancel了,我滴个乖乖,这是咋回事,被取消了,后来经过仔细排查后发现了以下两个问题 1.AJAX和form表单同时使用,(form提交 ...
- THinkPHP 5.0 域名路由
ThinkPHP支持完整域名.子域名和IP部署的路由和绑定功能 要启用域名部署路由功能,首先需要开启: 'url_domain_deploy' => true 定义域名部署规则支持两种方式:动态 ...
- ssh: connect to host localhost port 22: Connection refused
1.hadoop安装好之后,执行ssh localhost无法执行, 提示“ssh: connect to host localhost port 22: Connection refused”. 2 ...
- SyntaxHighlighter使用方法
原名:SyntaxHighlighter,是一款用于web页面的代码着色工具,可以用来着色多种语言,可以是HTML,CSS,Javascript,还可以是C,JAVA等编程语言.最早见于Yahoo的Y ...
- 【dp】奶牛家谱 Cow Pedigrees
令人窒息的奶牛题 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < ...
- SVG path
在网页上画一图形,比如星星或波浪线,开始是想着图形软件画一个的,后来发现SVG这绘图程序的语言,感觉甚是可以,就发了些时间学了一下,在此做一简单分享和记录. 菜鸟上是这么介绍的(SVG 是使用 XML ...
- js数据结构与算法--递归
递归,函数自己调用自己 return 返回值, 后面的代码不执行 function fn(num){ console.log(num) if(num == 0){ return; } fn(num-1 ...
- JZOJ 4725. 质数序列
Description 由于去NOI的火车“堵”了数不清时间,小Z和小D打完ETG,闲着无聊开始看今年的JSOI省选题,并尝试着修改题目:对于一个长度为L ≥ 2的序列,X:x1,x2,...,xL ...