您的位置:首页 > 编程语言 > Java开发

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方式注入的。

<自定义实现限定器注解>

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: