Spring技术内幕之Bean自动装配
2016-05-23 11:56
267 查看
spring Bean自动装配
1.byName--把与Bean的属性具体相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配
2.byType--把与Bean的属性具体相同类型的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配。
3.constructor-把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中。
4.autodetect--首先尝试使用constructor进行自动装配,如果失败就再尝试使用byType进行自动装配
Spring2.5开始支持注解自动装配 在xml文件中配置 <context:annotation-config/> 开启对代码注解的扫描,
Spring3.0支持的自动装配的注解:
1.Spring自带@Autowired 默认按照byType自动装配 @Autowired(required=true) 依赖关系必须存在,,如果不存在则抛出NoSuchBeanDefinitionException
2.JSR-330的@Inject
3.JSR-330的@Resource import javax.annotation.Resource包下的注解
[b]<@Autowired 注解>
@Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,则又按照byName方式比对,如果还有多个,则报出异常。
比如下面的例子:
@Autowired
private UserRepository userRepository
UserRepository 注入的过程:
1. spring会先匹配类型为UserRepository 的Bean
2. 如果存在且唯一,则直接返回userRepository对象;
3. 如果不唯一,则又在结果集里寻找name为UserRepository 的Bean,当找不到一个匹配的 Bean 时,Spring容器将抛BeanCreationException 异常。
Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,使@Autowired按照byName方式注入 这样歧义就消除了,可以通过下面的方法解决异常
@Autowired
@Qualifier("userRepository")
private UserRepository userRepository
[/b]
另注:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的。
<自定义实现限定器注解>
<@Inject>
@Inject是JSR-330定义的依赖注入规范
同@Autowired一样,可以自动装配属性/方法/构造器
不同的是@Inject没有required属性,因此@Inject注解所标注的依赖关系必须存在,否则抛出异常
限定@Inject所标注的属性@Named,功能同@Qualifier类似,
不同的是语义层面:Spring的@Qualifier主角可以帮助我们缩小匹配Bean的范围(默认使用Bean的ID),而@Named通过Bean的ID来标识可选择的Bean
<[b]@Resource注解>[/b]
@Resource默认按byName装配,当找不到与名称匹配的bean才会按byType装配
<Spring的其他常用注解>
@Component-通用的构造型注解,标识该类为Spring的组件,需要搭配 component-scan 使用
@Controller-标识该类为前端控制层
@Service-标识该类为业务层
@Repository-标识该类为数据访问层
@Configuration-[b] Spring 3.X 后提供的注解,用于取代
XML 来配置 Spring[/b]
@PropertySource-读取properties配置文件 (读取当前工程下指定的properties文件:
@PropertySource(value ={"file:${user.dir}/config/customize.properties","file:${user.dir}/config/graph.properties"}, ignoreResourceNotFound = true))
1.byName--把与Bean的属性具体相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配
2.byType--把与Bean的属性具体相同类型的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字匹配的Bean,则该属性不进行装配。
3.constructor-把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中。
4.autodetect--首先尝试使用constructor进行自动装配,如果失败就再尝试使用byType进行自动装配
Spring2.5开始支持注解自动装配 在xml文件中配置 <context:annotation-config/> 开启对代码注解的扫描,
Spring3.0支持的自动装配的注解:
1.Spring自带@Autowired 默认按照byType自动装配 @Autowired(required=true) 依赖关系必须存在,,如果不存在则抛出NoSuchBeanDefinitionException
2.JSR-330的@Inject
3.JSR-330的@Resource import javax.annotation.Resource包下的注解
[b]<@Autowired 注解>
@Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,则又按照byName方式比对,如果还有多个,则报出异常。
比如下面的例子:
@Autowired
private UserRepository userRepository
UserRepository 注入的过程:
1. spring会先匹配类型为UserRepository 的Bean
2. 如果存在且唯一,则直接返回userRepository对象;
3. 如果不唯一,则又在结果集里寻找name为UserRepository 的Bean,当找不到一个匹配的 Bean 时,Spring容器将抛BeanCreationException 异常。
Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,使@Autowired按照byName方式注入 这样歧义就消除了,可以通过下面的方法解决异常
@Autowired
@Qualifier("userRepository")
private UserRepository userRepository
[/b]
另注:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的。
<自定义实现限定器注解>
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.beans.factory.annotation.Qualifier; /** * 自定义限定器,类似@Qualifier * @author xiaowen * */ @Target({ ElementType.FIELD, ElementType.TYPE,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface Instrumet { }使用如下:
@Autowired @Instrumet private UserRepository userRepository
<@Inject>
@Inject是JSR-330定义的依赖注入规范
同@Autowired一样,可以自动装配属性/方法/构造器
不同的是@Inject没有required属性,因此@Inject注解所标注的依赖关系必须存在,否则抛出异常
限定@Inject所标注的属性@Named,功能同@Qualifier类似,
不同的是语义层面:Spring的@Qualifier主角可以帮助我们缩小匹配Bean的范围(默认使用Bean的ID),而@Named通过Bean的ID来标识可选择的Bean
<[b]@Resource注解>[/b]
@Resource默认按byName装配,当找不到与名称匹配的bean才会按byType装配
<Spring的其他常用注解>
@Component-通用的构造型注解,标识该类为Spring的组件,需要搭配 component-scan 使用
@Controller-标识该类为前端控制层
@Service-标识该类为业务层
@Repository-标识该类为数据访问层
@Configuration-[b] Spring 3.X 后提供的注解,用于取代
XML 来配置 Spring[/b]
@PropertySource-读取properties配置文件 (读取当前工程下指定的properties文件:
@PropertySource(value ={"file:${user.dir}/config/customize.properties","file:${user.dir}/config/graph.properties"}, ignoreResourceNotFound = true))
相关文章推荐
- MyEclipse设置编码方式
- eclipse xml文件中按alt+/没有提示信息
- 如何将android studio项目转换成eclipse
- java中的多态
- 服务器使用json时报错java.lang.ClassNotFoundException: org.json.JSONException
- java的动态代理机制详解
- 深入理解java异常处理机制
- java批量将GBK项目源码转成utf-8
- 全栈式的Java开发框架JHipster简介(二)
- 全栈式的Java开发框架JHipster简介(一)
- 浅析Java中的final关键字
- java中 接口的作用是什么
- JAVA如何判断两个字符串是否相等
- [spring源码学习]十、IOC源码-conversionService
- Java静态导入(import static)
- JAVA集合
- 解决Spring定时计划任务重复执行两次(实例被构造两次)问题的方法
- JFinal 3分钟入门
- Java 实现MapReduce函数
- Web项目中获取SpringBean——在非Spring组件中获取SpringBean