歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring中 FactoryBean和bean

Spring中 FactoryBean和bean

日期:2017/3/1 10:18:15   编辑:Linux編程

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

  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. <!-- 測試factorybean -->
  10. <bean id="factorybean1" class="org.ymm.entity.TestBean" />
  11. </beans>

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

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

Copyright © Linux教程網 All Rights Reserved