2.0
@Required
设置在set方法上如果该属性的参数没设置就会报
异常:
org.springframework.beans.factory.BeanInitializationException
2.5
@PostConstruct和@PreDestroy
3.0
JSR-330(javaee6:javax.inject),如注解@Inject和@Named。
@Component,@Repository和@Service是一样的,都是在声明Spring IoC容器中的bean。
@Autowired和@Component
@Inject和@Named基本上,它的工作原理和上面相同,只是用不同的注解
JSR-330和spring的区别:
1.@Inject没有required的属性,以确保bean被注入成功
2.在spring容器中,JSR默认的范围是单例,提供了@Scope注解。不过,这其中仅用于用于创建自己的注解,不像spring中可以用@Scope来定义范围,
3.没有相当于spring中的@Value,@Required或者@Lazy
Spring的注解更强大,但仅适用于Spring框架。
该JSR-330是一个标准的规范,并且它支持所有的JavaEE环境遵循JSR-330规范的。
对于新的或迁移的项目,它总是建议使用JSR-330的注解,它适用于spring3最好。
xml中的定义会覆盖类中注解的Bean(spring工厂管理的类)定义
注释需要组件扫描工作
<context:component-scan base-package="" />
该标签表示隐式注册后处理器包括AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor
或者使用隐式注册(隐式注册 post-processors 包括了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor。)
<context:annotation-config/>
<context:annotation-config/>
如果你在web.xml中配置了DispatcherServle,在控制器它只检查@Autowired而不会检查其他,反之它会扫描类中的后置处理器
@Autowired
@Autowired默认按类型自动注入属性,如果要按名字可在方法参数上加@Qualifier("")或者在方法上加@Qualifier(""),如果属性没设置有不想报错加上@Autowired(required=false)
@Autowired
1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。
<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
</beans>
@Resource
1、@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,@Resource 默认按 byName 自动注入罢了。
2、要让注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
3、@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
@PostConstruct 和 @PreDestroy
标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。
public class CachingMovieLister {
@PostConstruct
public void populateMovieCache() {
// populates the movie cache upon initialization...
}
@PreDestroy
public void clearMovieCache() {
// clears the movie cache upon destruction...
}
}
@Component
1、使用@Component注解可以直接定义Bean,而无需在xml定义。但是若两种定义同时存在,xml中的定义会覆盖类中注解的Bean定义。
2、@Component 有一个可选的入参,用于指定 Bean 的名称。
@Component
public class ActionMovieCatalog implements MovieCatalog {
// ...
}
4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标