学习Sring3注解注入详解

来源:互联网 发布:阿里云静态资源库 编辑:程序博客网 时间:2024/06/10 11:56

1.@Autowired注解(不推荐使用,建议使用@Resourse)

@Autowired可以对成员变量、方法、和构造函数进行标注,来完成自动装配的工作。

@Autowired的标注位置不同,他们都会在spring在初始化这个bean时,自动装配这个属性。要使@Autowired能够工作,还需要在配置文件中加入:

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 

当spring容器启动时,AutowiredAnnotationBeanPostProcessor将扫描spring容器中所有的Bean,当发现Bean中拥有@Autowired注释时就找到和其匹配的Bean,

并注入到对应的地方中去。

2.@Qualifier注解

@Autowired是根据类型进行自动装配的。如果当spring上下午中存在不止一个UserDao类型的Bean时,就会抛出BeanCreationException异常;如果上下午中不存在UserDao类型的Bean,也会抛出同样的异常。我们可以使用@Qualifier配合@Autowired来解决这个问题。

1)可能存在多个UserDao实例

Java代码:

  1. @Autowired       
  2. @Qualifier("userServiceImpl")         
  3. public IUserService userService;  
或者

@Autowired

public void setUserDao(@Qualifier("userDao) UserDao userDao){

this.userDao=userDao;

}

2)可能不存在UserDao实例

Java代码

@Autowired(required=true)

public IUserService userService;

3@Resource注解

JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解。@Resource的作用相当于@Autowired,只不过@Autowired按类型自动注入,而@Resource默认按byName自动注入。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为Bean的名字,而type属性则解析为Bean的类型,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。要使用@Resource能够工作,还需要在配置文件中加入:<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

@Resource装配顺序:

a如果同时指定了name和type,则从Spring上下文中找到唯一匹配的Bean进行装配,找不到则抛出异常。

b如果指定了name,则从上下文中查找名称(id)匹配的Bean进行装配,找不到则抛出异常。

c如果指定了type,则从上下文找到类型匹配的唯一的Bean进行装配,找不到或找到多个,都会抛出异常。

d如果即没有只大牛股name,又没有指定type则自动按照byName方法进行装配。

4@PostConstruct(JSR-250)注解

在方法上加上@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行。Bean的初始化包括,实例化Bean,并装配Bean的属性。他的一个典型的应用场景是,当你需要往Bean中注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的setter方法时:

  1. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {        
  2.     
  3.     private SessionFactory mySessionFacotry;        
  4.     
  5.     @Resource    
  6.     public void setMySessionFacotry(SessionFactory sessionFacotry)     
  7.     {        
  8.         this.mySessionFacotry = sessionFacotry;        
  9.     }        
  10.     
  11.     @PostConstruct       
  12.     public void injectSessionFactory()     
  13.     {        
  14.         super.setSessionFactory(mySessionFacotry);        
  15.     }     
  16. }  
这里通过@PostConstruct,为UserDaoImpl的父类里定义的一个sessionFactory私有属性,注入了我们自己定义的sessionFactory,之后我们就可以通过调研super。getSessionFactory()来访问该属性了。

0 0