Spring技术内幕之Bean自动装配

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包下的注解

<@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

另注:@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


<@Resource注解>



@Resource默认按byName装配,当找不到与名称匹配的bean才会按byType装配


<Spring的其他常用注解>

@Component-通用的构造型注解,标识该类为Spring的组件,需要搭配 component-scan 使用


@Controller-标识该类为前端控制层

@Service-标识该类为业务层


@Repository-标识该类为数据访问层

@Configuration- Spring 3.X 后提供的注解,用于取代 XML 来配置 Spring

@PropertySource-读取properties配置文件 (读取当前工程下指定的properties文件:

@PropertySource(value ={"file:${user.dir}/config/customize.properties","file:${user.dir}/config/graph.properties"}, ignoreResourceNotFound = true))


你可能感兴趣的:(Spring技术内幕之Bean自动装配)