本文介绍了使用spring注解注入属性的方法。使用注解以前,注入属性通过类以及配置文件来实现。现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现。
1.1、使用注解以前我们是怎样注入属性的
- public class UserManagerImpl implements UserManager {
- private UserDao userDao;
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
- ...
- }
配置文件:
- <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl">
- <property name="userDao" ref="userDao" />
- </bean>
- <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">
- <property name="sessionFactory" ref="mySessionFactory" />
- </bean>
1.2、引入@Autowired注解
@Autowired是根据类型进行自动装配的,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作;如果想按照名称来转配注入,则需要结合@Qualifier一起使用;该注解是Spring提供的;默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false。
对成员变量进行标注
public class UserManagerImpl implements UserManager {
- @Autowired
- private UserDao userDao;
- ...
- }
对方法进行标注
- public class UserManagerImpl implements UserManager {
- private UserDao userDao;
- @Autowired
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
- ...
- }
配置文件
- <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl" />
- <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">
- <property name="sessionFactory" ref="mySessionFactory" />
- </bean>
1.3、@Qualifier
在上面的例子中,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出 BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。
a. 可能存在多个UserDao实例:
- @Autowired
- public void setUserDao(@Qualifier("userDao") UserDao userDao) {
- this.userDao = userDao;
- }
这样,Spring会找到id为userDao的bean进行装配。
b. 可能不存在UserDao实例:
- @Autowired(required = false)
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
1.4、@Resource(JSR-250标准注解,减少系统对spring的依赖,推荐使用它来代替Spring专有的@Autowired注解)
@Resource装配顺序
a. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
b. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
c. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
d. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配,找不到再按type去匹配。
1.5、@PostConstruct(JSR-250)和 @PreDestroy(JSR-250)
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式:@PostConstruct Public void someMethod() {} 或者public @PostConstruct void someMethod(){}。被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行。
1.6、spring配置注解
使用注解的方式,我们需要修改spring配置文件文件中增加:<context:annotation-config/>