歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring中 FactoryBean和bean

1.整合spring+hibernate中,讓spring接管hibernate的session工廠有一段代碼

  1. <bean id="sFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
查看源碼:org.springframework.orm.hibernate3.LocalSessionFactoryBean:
  1. public class LocalSessionFactoryBean extends AbstractSessionFactoryBean implements BeanClassLoaderAware  
在到AbstractSessionFactoryBean:
  1. public abstract class AbstractSessionFactoryBean  
  2.         implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator   

發現了實現了一個factoryBean<T>,裡面給了個泛型(SeesionFactory).


注:這個bean和其他的bean不一樣,spring中有兩種bean.
普通bean和bean工廠,即FactoryBean.  FactoryBean 返回的不是這個類的實例,其返回的是該工廠Bean的getObject()方法所返回的對象
普通的Bean直接返回指定類(配置中的class屬性的值)的一個實例.


一個小例子:

  1. package org.ymm.entity;  
  2.   
  3. import org.springframework.beans.factory.FactoryBean;  
  4.   
  5. /** 
  6.  * TestBean 類實現了FactoryBean<T> 
  7.  * @author witho_000 
  8.  * 
  9.  */  
  10.   
  11. public class TestBean implements FactoryBean<Object>{  
  12.   
  13.     public Object getObject() throws Exception {  
  14.         // TODO Auto-generated method stub   
  15.         return "string類型";  
  16.     }  
  17.   
  18.     @Override  
  19.     public Class<?> getObjectType() {  
  20.         // TODO Auto-generated method stub   
  21.         return null;  
  22.     }  
  23.   
  24.     @Override  
  25.     public boolean isSingleton() {  
  26.         // TODO Auto-generated method stub   
  27.         return false;  
  28.     }  
  29.   
  30. }  

 
  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.      xmlns:context="http://www.springframework.org/schema/context"  
  5.      xsi:schemaLocation="http://www.springframework.org/schema/beans   
  6.          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  7.          http://www.springframework.org/schema/context   
  8.          http://www.sprinsgframework.org/schema/context/spring-context-3.0.xsd">   
  9.              
  10.     <!-- 測試factorybean -->  
  11.       
  12.     <bean id="factorybean1" class="org.ymm.entity.TestBean" />  
  13.           
  14. </beans>  

 
  1. package org.ym.test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import org.ymm.entity.TestBean;  
  6.   
  7. /** 
  8.  * Tester測試類 
  9.  * @author witho_000 
  10.  * 
  11.  */  
  12.   
  13. public class Tester {  
  14.       
  15.     public static void main(String[] args) {      
  16.           
  17.         ApplicationContext cont=new ClassPathXmlApplicationContext("beans.xml");  
  18.         String s= cont.getBean("&factorybean1",String.class);  
  19.         System.out.println(s.getClass());  
  20.     }  
  21. }  
顯然沒有報錯,返回的正是String類型。而不是spring配置的TestBean類型;

網上找到的小技巧:
String s= cont.getBean("&factorybean1",String.class);
 bean的id前加個&得到的就是TestBean

Copyright © Linux教程網 All Rights Reserved