Spring的依赖注入(接口注入)

来源:互联网 发布:小米盒子无法连接网络 编辑:程序博客网 时间:2024/05/19 12:14
Java代码  收藏代码
  1. Spring的依赖注入(接口注入)  
  2. 2009-11-26 10:06 148人阅读 评论(0) 收藏 举报  
  3.   这篇文章来谈谈《Spring Framework 开发参考手册》的3.3.3.1小节中的Lookup方法注入。  
  4.    
  5.   仔细看看文档,这种方法主要是用在Singleton的Object中使用非Singleton的Bean时,通过lookup-method的  
Java代码  收藏代码
  1. 那个方法来取得非Singleton的Bean。一般用的不多,在用这种定义之前最好想明白你的需求。  
  2.    
  3.    
  4. · 先建立一个包:javamxj.spring.basic.lookup ,然后把以下5个文件放在这个包下。  
  5.    
  6. Hello.java.   
  7. package javamxj.spring.basic.lookup;  
  8. public interface Hello {  
  9.     public Random getRandom();  
  10.     public abstract Random createRandom();  
  11. }  
  12.    
  13.    
  14. Random.java  
  15.    
  16. package javamxj.spring.basic.lookup;  
  17. public class Random {  
  18.     private int i = (int) (100 * Math.random());  
  19.     public void printRandom() {  
  20.         System.out.println("输出随机整数:  " + i);  
  21.     }  
  22. }  
  23.    
  24.    
  25. HelloAbstract.java   
  26. package javamxj.spring.basic.lookup;  
  27. public abstract class HelloAbstract implements Hello {  
  28.     private Random random;  
  29.     public Random getRandom() {  
  30.         return random;  
  31.     }  
  32.     public void setRandom(Random random) {  
  33.         this.random = random;  
  34.     }  
  35.     public abstract Random createRandom();  
  36. }  
  37.    
  38.    
  39. beans.xml   
  40. <?xml version="1.0" encoding="GBK"?>  
  41. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  42. <beans>  
  43.     <bean id="ran" class="javamxj.spring.basic.lookup.Random" singleton="false"/>  
  44.       
  45.     <bean id="hello" class="javamxj.spring.basic.lookup.HelloAbstract">  
  46.         <lookup-method name="createRandom" bean="ran"/>  
  47.         <property name="random">  
  48.             <ref local="ran"/>  
  49.         </property>  
  50.     </bean>  
  51.       
  52. </beans>  
  53.    
  54.    
  55. Main.java  
  56.    
  57. package javamxj.spring.basic.lookup;  
  58. import org.springframework.beans.factory.BeanFactory;  
  59. import org.springframework.beans.factory.xml.XmlBeanFactory;  
  60. import org.springframework.core.io.ClassPathResource;  
  61. import org.springframework.core.io.Resource;  
  62. public class Main {  
  63.     public static void main(String[] args) {  
  64.         Resource res = new ClassPathResource( "javamxj/spring/basic/lookup/beans.xml");  
  65.         BeanFactory ft = new XmlBeanFactory(res);  
  66.         Hello h = (Hello) ft.getBean("hello");  
  67.         Random r1 = h.getRandom();  
  68.         Random r2 = h.getRandom();  
  69.         System.out.println("没有采用Lookup方法注入:");  
  70.         System.out.println("Random 的两个实例指向同一个引用:" + (r1 == r2));  
  71.         r1.printRandom();  
  72.         r2.printRandom();  
  73.         Random r3 = h.createRandom();  
  74.         Random r4 = h.createRandom();  
  75.         System.out.println("/n采用Lookup方法注入:");  
  76.         System.out.println("Random 的两个实例指向同一个引用:" + (r3 == r4));  
  77.         r3.printRandom();  
  78.         r4.printRandom();  
  79.     }  
  80. }    
  81.    
  82.    
  83. 简单说明一下:  
  84.    
  85. · Hello是一个接口类,实现面向接口编程。  
  86.    
  87. · Random类用来输出随机整数。  
  88.    
  89. · HelloAbstract是一个抽象类,包含了一个属性:random,还包含一个抽象方法createRandom(),如果这个方法不是抽象的,spring会重写已有的实现。  
  90.    
  91. · beans.xml中定义了两个bean,ran指向Rondom类,注意它不是singleton的;hello指向HelloAbstract类,其中的random属性指向ran,createRandom方法也指向ran。  
  92.    
  93. · 在Main类中,Hello类分别利用getRandom()和createRandom()方法来调用Random类。  
  94.    
  95. · 这次需要将 spring-framework主目录/lib/cglib 目录中的cglib-nodep-2.1_2.jar加入到项目的 Libraries中,使用其中的动态代理。  
  96.    
  97.    
  98. 运行结果:  
  99.    
  100. 没有采用Lookup方法注入:  
  101. Random 的两个实例指向同一个引用:true  
  102. 输出随机整数:  98  
  103. 输出随机整数:  98  
  104.    
  105. 采用Lookup方法注入:  
  106. Random 的两个实例指向同一个引用:false  
  107. 输出随机整数:  51  
  108. 输出随机整数:  26  
  109.   
  110. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/javamxj/archive/2005/08/17/456600.aspx  
 我的理解:接口注入其实是,通过配置Spring的lookup-method,及返回值 ,可以返回接口中方法的返回值而不需要实现接口中的抽象方法
0 0
原创粉丝点击