Spring 注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性详解

本文介绍了使用spring注解注入属性的方法。使用注解以前,注入属性通过类以及配置文件来实现。现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现。

1.1、使用注解以前我们是怎样注入属性的

  1. public class UserManagerImpl implements UserManager {       
  2.     private UserDao userDao;       
  3.     public void setUserDao(UserDao userDao) {       
  4.         this.userDao = userDao;       
  5.     }       
  6.     ...       
  7. }   

配置文件:

  1. <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl">   
  2.     <property name="userDao" ref="userDao" />   
  3. </bean>   
  4. <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">   
  5.     <property name="sessionFactory" ref="mySessionFactory" />   
  6. </bean>     

1.2、引入@Autowired注解

@Autowired是根据类型进行自动装配的,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作;如果想按照名称来转配注入,则需要结合@Qualifier一起使用;该注解是Spring提供的;默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false。

对成员变量进行标注

public class UserManagerImpl implements UserManager {    

  1.     @Autowired   
  2.     private UserDao userDao;    
  3.     ...    
  4. }    

对方法进行标注

  1. public class UserManagerImpl implements UserManager {    
  2.     private UserDao userDao;    
  3.     @Autowired   
  4.     public void setUserDao(UserDao userDao) {    
  5.         this.userDao = userDao;    
  6.     }    
  7.     ...    
  8. }   

配置文件

  1. <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl" />   
  2. <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">   
  3.     <property name="sessionFactory" ref="mySessionFactory" />   
  4. </bean>   

1.3、@Qualifier

在上面的例子中,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出 BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。

a. 可能存在多个UserDao实例:

  1. @Autowired   
  2. public void setUserDao(@Qualifier("userDao") UserDao userDao) {    
  3.     this.userDao = userDao;    
  4. }    

这样,Spring会找到id为userDao的bean进行装配。

b. 可能不存在UserDao实例:

  1. @Autowired(required = false)    
  2. public void setUserDao(UserDao userDao) {    
  3.     this.userDao = userDao;    
  4. }   

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/>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值