spring中FactoryBean和bean

2014-11-24 08:31:41 · 作者: · 浏览: 0

1.整合spring+hibernate中,让spring接管hibernate的session工厂有一段代码
[java]

查看源码:org.springframework.orm.hibernate3.LocalSessionFactoryBean:
[java]
public class LocalSessionFactoryBean extends AbstractSessionFactoryBean implements BeanClassLoaderAware

在到AbstractSessionFactoryBean:
[java]
public abstract class AbstractSessionFactoryBean
implements FactoryBean, InitializingBean, DisposableBean, PersistenceExceptionTranslator

发现了实现了一个factoryBean,里面给了个泛型(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
* @author witho_000
*
*/

public class TestBean implements FactoryBean{

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" >
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">





[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