灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3576回复:0

spring中FactoryBean和bean

楼主#
更多 发布于:2012-09-08 09:47


1.整合spring+hibernate中,让spring接管hibernate的session工厂有一段代码
[java]
<bean id="sFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
查看源码:org.springframework.orm.hibernate3.LocalSessionFactoryBean:
[java]
public class LocalSessionFactoryBean extends AbstractSessionFactoryBean implements BeanClassLoaderAware
在到AbstractSessionFactoryBean:
[java]
public abstract class AbstractSessionFactoryBean
        implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator  
发现了实现了一个factoryBean<T>,里面给了个泛型(SeesionFactory).
注:这个bean和其他的bean不一样,spring中有两种bean.
普通bean和bean工厂,即FactoryBean.  FactoryBean 返回的不是这个类的实例,其返回的是该工厂Bean的getObject()方法所返回的对象
普通的Bean直接返回指定类(配置中的class属性的值)的一个实例.
一个小例子:
[java]
package org.ymm.entity;

import org.springframework.beans.factory.FactoryBean;

/**
* TestBean 类实现了FactoryBean<T>
* @author witho_000
*
*/

public class TestBean implements FactoryBean<Object>{

    public Object getObject() throws Exception {
        // TODO Auto-generated method stub
        return "string类型";
    }

    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return false;
    }

}
[java]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsichemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.sprinsgframework.org/schema/context/spring-context-3.0.xsd">

    <!-- 测试factorybean -->

    <bean id="factorybean1" class="org.ymm.entity.TestBean" />

</beans>
[java]
package org.ym.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ymm.entity.TestBean;

/**
* Tester测试类
* @author witho_000
*
*/

public class Tester {

    public static void main(String[] args) {    

        ApplicationContext cont=new ClassPathXmlApplicationContext("beans.xml");
        String s= cont.getBean(";factorybean1",String.class);
        System.out.println(s.getClass());
    }
}
显然没有报错,返回的正是String类型。而不是spring配置的TestBean类型;

网上找到的小技巧:
String s= cont.getBean(";factorybean1",String.class);
bean的id前加个;得到的就是TestBean
作者:without0815

喜欢0 评分0
游客

返回顶部