Spring对于Bean的依赖注入,支持多种注解方式:
@Resource javax.annotationJSR250 (Common Annotations for Java)
@Inject javax.injectJSR330 (Dependency Injection for Java)
@Autowired org.springframework.bean.factory
@Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,Spring对这些注解也进行了支持。
加载bean的原理:
@Autowired和@Inject这两个注解行为完全相同,都是通过 AutowiredAnnotationBeanPostProcessor 来实现依赖注入,即在注入Spring bean的时候‘@Autowired’和‘@Inject’可以互换。其加载bean的执行逻辑顺序如下:
Matches by Type。
Restricts by Qualifiers
Matches by Name
@Resource是用CommonAnnotationBeanPostProcessor类实现的依赖注入,其加载bean的执行逻辑顺序如下:
Matches by Name
Matches by Type
Restricts by Qualifiers (ignored if match is found by name)
@Autowired有个required属性,可以配置为false,这种情况下如果没有找到对应的bean是不会抛异常的。@Inject和@Resource没有提供对应的配置,所以必须找到否则会抛异常。
Spring注解风格最佳实践:
- 显式命名component:@Component(“beanName”)。
- 使用‘@Resource’的时候带上name属性:@Resource(name=”beanName”)。
- 避免使用‘@Qualifier’,除非你想创建一个bean列表。例如,你可能想使用特定‘@Qualifier’来标记一些规则,然后将这些规则类注入到一个列表中,从而使用这个规则列表来处理数据。
- 扫描component的时候使用更具体的包:context:component-scan base-package=“com.sourceallies.person”。虽然这会导致更多的component-scan配置,但是能够在当前 Spring context中减少不必要的component。
遵循这些规则的话,应该可以增加Spring注解配置的可读性和稳定性:)