Spring@Autowired注解与自动装配

来源:互联网 发布:unity3d shader教程 编辑:程序博客网 时间:2024/06/05 17:38

1   配置文件的方法

 

我们编写spring 框架的代码时候。一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量。并且要配套写上 get 和 set方法。

 

Boss 拥有 Office 和 Car 类型的两个属性:   
  
  
清单 3. Boss.java

 

[java] view plain copy
 print?
  1. package com.baobaotao;     
  2.     
  3. public class Boss {     
  4.     private Car car;     
  5.     private Office office;     
  6.     
  7.     // 省略 get/setter     
  8.     
  9.     @Override    
  10.     public String toString() {     
  11.         return "car:" + car + "/n" + "office:" + office;     
  12.     }     
  13. }     

    
  System.out.println必须实现toString方法
  
我们在 Spring 容器中将 Office 和 Car 声明为 Bean,并注入到 Boss Bean 中:下面是使用传统 XML 完成这个工作的配置文件 beans.xml:   
  
  
清单 4. beans.xml 将以上三个类配置成 Bean   
                   
[xhtml] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8" ?>     
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">     
  6.     <bean id="boss" class="com.baobaotao.Boss">     
  7.         <property name="car" ref="car"/>     
  8.         <property name="office" ref="office" />     
  9.     </bean>     
  10.     <bean id="office" class="com.baobaotao.Office">     
  11.         <property name="officeNo" value="002"/>     
  12.     </bean>     
  13.     <bean id="car" class="com.baobaotao.Car" scope="singleton">     
  14.         <property name="brand" value=" 红旗 CA72"/>     
  15.         <property name="price" value="2000"/>     
  16.     </bean>     
  17. </beans>     

    
  
  
当我们运行以下代码时,控制台将正确打出 boss 的信息:   
  
  
清单 5. 测试类:AnnoIoCTest.java   
                   
[java] view plain copy
 print?
  1. import org.springframework.context.ApplicationContext;     
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;     
  3. public class AnnoIoCTest {     
  4.     
  5.     public static void main(String[] args) {     
  6.         String[] locations = {"beans.xml"};     
  7.         ApplicationContext ctx =      
  8.             new ClassPathXmlApplicationContext(locations);     
  9.         Boss boss = (Boss) ctx.getBean("boss");     
  10.         System.out.println(boss);     
  11.     }     
  12. }     
  13.       

  
  
这说明 Spring 容器已经正确完成了 Bean 创建和装配的工作。   

 

 

2   @Autowired 

 

Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。

 

 

要实现我们要精简程序的目的。需要这样来处理: 

* 在applicationContext.xml中加入: 
  

[c-sharp] view plain copy
 print?
  1. <!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->     
  2.   <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  
 

Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。   


* 修改在原来注入spirng容器中的bean的方法。 
     在域变量上加上标签@Autowired,并且去掉 相应的get 和set方法

 

清单 6. 使用 @Autowired 注释的 Boss.java   
                   

[java] view plain copy
 print?
  1. package com.baobaotao;     
  2. import org.springframework.beans.factory.annotation.Autowired;     
  3.     
  4. public class Boss {     
  5.     
  6.     @Autowired    
  7.     private Car car;     
  8.     
  9.     @Autowired    
  10.     private Office office;     
  11.     
  12.     …     
  13. }     
 

 

 

* 在applicatonContext.xml中 把原来 引用的<porpery >标签也去掉。

 

         

[xhtml] view plain copy
 print?
  1.             
  2. <?xml version="1.0" encoding="UTF-8" ?>     
  3. <beans xmlns="http://www.springframework.org/schema/beans"    
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">     
  7.     
  8.     <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->     
  9.     <bean class="org.springframework.beans.factory.annotation.     
  10.         AutowiredAnnotationBeanPostProcessor"/>     
  11.     
  12.     <!-- 移除 boss Bean 的属性注入配置的信息 -->     
  13.     <bean id="boss" class="com.baobaotao.Boss"/>     
  14.       
  15.     <bean id="office" class="com.baobaotao.Office">     
  16.         <property name="officeNo" value="001"/>     
  17.     </bean>     
  18.     <bean id="car" class="com.baobaotao.Car" scope="singleton">     
  19.         <property name="brand" value=" 红旗 CA72"/>     
  20.         <property name="price" value="2000"/>     
  21.     </bean>     
  22. </beans>    
 

 这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。   
  
按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。   
  
当然,您也可以通过 @Autowired 对方法或构造函数进行标注,如果构造函数有两个入参,分别是 bean1 和 bean2,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为 CountryService (Bean1 bean1 ,Bean2 bean2) 的入参来创建 CountryService Bean。来看下面的代码:  对方法

 

[java] view plain copy
 print?
  1. package com.baobaotao;     
  2.     
  3. public class Boss {     
  4.     private Car car;     
  5.     private Office office;     
  6.     
  7.      @Autowired    
  8.     public void setCar(Car car) {     
  9.         this.car = car;     
  10.     }     
  11.       
  12.     @Autowired    
  13.     public void setOffice(Office office) {     
  14.         this.office = office;     
  15.     }     
  16.     …     
  17. }     
 

 

这时,@Autowired 将查找被标注的方法的入参类型的 Bean,并调用方法自动注入这些 Bean。而下面的使用方法则对构造函数进行标注:   

[java] view plain copy
 print?
  1. package com.baobaotao;     
  2.     
  3. public class Boss {     
  4.     private Car car;     
  5.     private Office office;     
  6.       
  7.     @Autowired    
  8.     public Boss(Car car ,Office office){     
  9.         this.car = car;     
  10.         this.office = office ;     
  11.     }     
  12.       
  13.     …     
  14. }     
 

 

由于 Boss() 构造函数有两个入参,分别是 car 和 office,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为 Boss(Car car ,Office office) 的入参来创建 Boss Bean。  

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡存款没有存进去怎么办 被黑网站黑钱了怎么办 饿了吗账户异常怎么办 单位里有人整你怎么办 乌鲁木齐信息采集结束后怎么办 头发很长时间不长怎么办啊 打嘟噜时间不长怎么办 阴茎勃起的时间不长怎么办 睡觉的时间不长怎么办 每次锻炼时间不长怎么办 微信好友不知道是谁怎么办 就一个软件闪退怎么办 葫芦侠修改闪退怎么办 戴尔游匣磁盘占用100怎么办 步步高家教机扫描笔不亮怎么办 社保卡手机号换了怎么办 香港公司进出口没有申报怎么办 智能电视右上角网络未连接怎么办 电子秤按键板不好用怎么办失灵 桑塔纳车钥匙锁车里了怎么办 舌头上有锯齿印怎么办 夏天有脚气脚臭怎么办 xp分辨率太高黑屏怎么办 农村淘宝标识类目没了怎么办 被投诉到食品监督局怎么办 被客户315投诉了怎么办 给人打不接受调解怎么办 失业证年审忘了怎么办 工商年检过期4天怎么办 个体营业执照年审过期了怎么办 企业年报密码忘了怎么办 税务年报报错了怎么办 工商证过期5年怎么办 车年检标志丢了怎么办 年检标志打错了怎么办 贵州个体出租车工商执照年检怎么办 驾驶证考试预约提示网络繁忙怎么办 帝豪显示屏花屏怎么办 注册公司居委会不盖章怎么办 营业执照名字和店名不一样怎么办 开炸鸡店没经验怎么办