Spring 中什么时候用 @Resource
,什么时候用 @service
?
当你需要定义某个类为一个 bean,则在这个类的类名前一行使用 @Service("myBean")
,就相当于将这个类定义为一个 bean,bean 名称为 myBean。
当需要在某个类中定义一个属性,并且该属性是一个已存在的 bean,要为该属性赋值或注入时在该属性上一行使用 @Resource(name="xxx")
,相当于为该属性注入一个名称为 xxx 的 bean。
Spring 不但支持自己定义的 @Autowired
注解,还支持几个由 JSR-250 规范定义的注解,它们分别是:
@Resource
@PostConstruct
@PreDestroy
@Resource
的作用相当于 @Autowired
,只不过 @Autowired
按 byType 自动注入,而 @Resource
默认按 byName 自动注入罢了。
@Resource
有两个属性是比较重要的,分是 name 和 type,Spring 将 @Resource
注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。
所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
@Resource
装配顺序
- 如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
- 如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
- 如果指定了 type,则从上下文中找到类型匹配的唯一 bean 进行装配,找不到或者找到多个,都会抛出异常。
- 如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
网友评论