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

Spring中@Autowired注解、@Resource注解的区别

2014-05-12 21:21 344 查看
Spring不但支持自己定义的
@Autowired
注解,还支持几个由
JSR-250
规范定义的注解,它们分别是
@Resource
@PostConstruct
以及
@PreDestroy
。  
@Resource
的作用相当于
@Autowired
,只不过
@Autowired
byType
自动注入,而
@Resource
默认按
byName
自动注入罢了。  
@Resource
装配顺序 
  1. 如果同时指定了
name
和type,则从Spring上下文中找到唯一匹配的
bean
进行装配,找不到则抛出异常 
  2. 如果指定了
name
,则从上下文中查找名称(
id
)匹配的
bean
进行装配,找不到则抛出异常 
  3. 如果指定了
type
,则从上下文中找到类型匹配的唯一
bean
进行装配,找不到或者找到多个,都会抛出异常 
  4. 如果既没有指定
name
,又没有指定
type
,则自动按照
byName
方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

@Autowired
@Resource
的区别:
1、 @Autowired与
@Resource
都可以用来装配
bean
. 都可以写在字段上,或写在
setter
方法上。2、 
@Autowired
默认按类型装配(这个注解是属于Spring的),默认情况下必须要求依赖对象必须存在,如果要允许
null
值,可以设置它的
required
属性为
false
,如:
@Autowired(required=false)
,如果我们想使用名称装配可以结合
@Qualifier
注解进行使用,如下:
@Autowired()@Qualifier("baseDao")
privateBaseDao baseDao;
并且不要简单的认为使用
@Qualifier
就是按名称匹配了,它的前提是先按类型,类型匹配上了,但有多个匹配的话,再按名称,如果仅仅是名称能对上,但类型不是,直接也是报没有候选匹配项的,报如下异常,完全无视你指定的
@Qualifier
。Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type'com.somnus.spring.annotation.autowired.HumanService' available: expected at least 1 bean which qualifies as autowire candidate.

而下面的
@Resource
如果指定了名称,哪怕类型不对,它也会先去拿对应的
name
去匹配,当匹配上了,但类型不对,再来抛异常,如
下面Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean named'dogService' is expected to be of type'com.somnus.spring.annotation.autowired.HumanService' but was actually of type'com.somnus.spring.annotation.autowired.DogService'
3、
@Resource
(这个注解属于J2EE的),它有两个重要属性
name
type
,默认安装名称进行装配,名称可以通过
name
属性进行指定,如果没有指定
name
属性:①当注解写在字段上时,默认取字段名进行安装名称查找,②如果注解写在
setter
方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果
name
属性一旦指定,就只会按照名称
byName
自动注入策略进行装配,如果指定
type
属性,则只会按照类型
byType
自动注入策略进行装配
@Resource(name="baseDao")
privateBaseDao baseDao;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: