读了文章 http://blog.csdn.net/xyh820/article/details/7303330/,非常不错,其中详细说明了spring中的注解。
这里仅做一下要点总结。
1、@Autowired
成员的自动装配 ,可标注在类成员变量、setter方法、构造方法之上,例如:当一个类中的成员是一个bean时,不必显式地指出这个bean对象是哪个,标了此注解之后,将自动寻找和它们类型匹配的Bean。
2、@Qualifier
结合@Autowired 使用,当同一类型的bean有多个时,使用@Qualifier 可以指出要采用的bean的name。也就是将原来装配的方式由byType改成了byName.
3、JSR-250中的注解
关于什么是JSR-250,下面是一段来自 https://en.wikipedia.org/wiki/JSR_250 的说明:
JSR 250 is a Java Specification Request with the objective to develop annotations (that is, information about a software program that is not part of the program itself) for common semantic concepts in the Java SE and Java EE platforms that apply across a variety of individual technologies. It was envisioned that various JSRs would use annotations to enable adeclarative style of programming. It would be especially valuable to have consistency within the Java EE component JSRs, but it is also valuable to allow consistency between Java EE and Java SE.
@Resource
@Resource
的作用相当于 @Autowired
,只不过 @Autowired
按 byType 自动注入,面@Resource
默认按 byName 自动注入罢了。@Resource
有两个属性是比较重要的,分别是 name 和 type,Spring 将@Resource
注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。
@PostConstruct 和 @PreDestroy
Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,这个可以通过在方法上标注@PostConstruct 和 @PreDestroy 来达到目的。
前面的注解要起作用,都需要在xml配置文件如beans.xml中添加必要的处理器,如 AutowiredAnnotationBeanPostProcessor
和 CommonAnnotationBeanPostProcessor 等,逐一指出这些bean会比较繁琐,最简单的方式是用下面的配置方式:
<span style="font-size:18px;color:#ff0000;"><strong><context:annotation-config/> </strong></span>有了它,就可以方便地 注册需要用到的
BeanPostProcessor
了。
<context:annotationconfig/> 将隐式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
、PersistenceAnnotationBeanPostProcessor
以及equiredAnnotationBeanPostProcessor
这 4 个 BeanPostProcessor。
当然,在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。
4、@Component与component-scan
@Repository 只能标注在 DAO 类上。这是因为该注解的作用不只是将类识别为 Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。
Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
- @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
- @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
使用方式:
1、在类定义前使用上述注解。
2、Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略。Spring 2.5 对 context 命名空间进行了扩展,提供了这一功能,请看下面的配置:
<context:component-scan base-package="com.mycompany">
将自动对所属包下的bean进行自动扫描。
若不指定value属性,则这些bean的name默认为类名首字母小写后得到的名称,如类名是UserController,则自动生成的bean对象的名称是userController。
当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。因为前者已经提供了后者的功能。
<context:component-scan/> 还允许定义过滤器将基包下的某些类纳入或排除。原文中提到: 定义过滤器时可有4种类型:注释类的名字、类名、正则表达式、AspectJ 表达式。下面是一个简单的例子:
<context:component-scan base-package="com.baobaotao"> <context:include-filter type="regex" expression="com\.baobaotao\.service\..*"/> <context:exclude-filter type="aspectj" expression="com.baobaotao.util..*"/> </context:component-scan>
默认情况下通过 @Component
定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过@Scope
注释来达到目的。