@Autowired/@Resource自动装配问题

spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。

注解自动装配注意的点

@Autowired注入
1、同一类型实例可以使用@Autowired注入多次,并且所有注入的实例都是同一个实例

2、当对接口进行注入时,应该为每个实现类指明相应的id,否则Spring将报错。

@Service("stu1")
接口Student的实现类1

@Service("stu2")
接口Student的实现类2

Spring就会根据字段名称默认去bean工厂找相应的bean进行注入,注意名称不能够随便取的,要和注入的属性名一致。或者使用名称装配可以结合@Qualifier注解进行使用。

@Autowired
private Student stu1;

或者

@Autowired
@Qualifier("stu1")
private Student stu;

如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)

@Autowired @Qualifie("userService") 是直接按照名字进行搜索,也就是说,对于UserServiceImpl 上面@Service注解必须
写名字,不写就会报错,而且名字必须是@Autowired @Qualifie("userService") 保持一致。

@Autowired/@Resource的异同

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

@Resource装配顺序
 1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
 2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
 3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
 4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

而如果你不用注解,用xml文件的时候,对于注入Bean的时候要求写一个id,xml文件时候的id就相当于这里的名字。

对于源码层面,bean实例化的时候,@Resource使用的是CommonAnnotationBeanPostProcessor后置处理器,而@Autowired使用的是AutowiredAnnotationBeanPostProcessor后置处理器

定义Bean的作用域和生命过程

@Scope("prototype")
值有:singleton,prototype,session,request,session,globalSession
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值