Sping 中的 beanFactory 与 FactoryBean

本文详细解析Spring框架中的BeanFactory和FactoryBean的核心概念。BeanFactory作为容器提供给使用者获取Bean的接口,而FactoryBean则用于生成Bean。以SessionFactory为例,展示了如何通过配置实现FactoryBean的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring  中有两个最最基本的接口:BeanFactory 与 FactoryBean,可以说是核心中的核心。

简单的说,BeanFactory就是容器提供给使用者获取Bean的接口,Spring中的ApplicationContext 就是实现了这个接口。粗糙的理解:BeanFactory就是容器。

FactoryBean则是产生Bean的工厂,许多时候,简单的通过Spring 实例化一个Bean,并不能满足我们的需求,最明显的例子就是数据库的连接池,这个连接池就是一个FactoryBean。Spring 如果发现某个Bean实现了FactoryBean那么当调用者取这个Bean的时候,不是直接返回这个Bean,而是去调用这个Bean的getObject(),再返回结果。

FactoryBean的定义很简单,只有三个方法:

public interface FactoryBean<T> {
       T getObject() throws Exception; // 拿到一个Bean
       Class<?> getObjectType(); //返回Bean的类型
       boolean isSingleton();    //是否单例
}

 

再看一个例子,hibernate的sessionFactory的配置(我们实际需要的是一个SessionFactory对象,但配置中却是LocalSessionFactoryBean类,为啥?就是因为LocalSessionFactoryBean返回的是SessionFactory)

 

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
		<property name="mappingResources">
			<list>
				<value>product.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<value>
				hibernate.dialect=org.hibernate.dialect.MySQLDialect
			</value>
		</property>
	</bean>

 

 

LocalSessionFactoryBean 就是实现了FactoryBean的接口,

public class LocalSessionFactoryBean extends HibernateExceptionTranslator
		implements FactoryBean<SessionFactory>, ResourceLoaderAware, InitializingBean, DisposableBean {

	.....其它代码........

	private SessionFactory sessionFactory;

	.....其它代码........

	@Override  //设置完参数后,产生sessionFactory
	public void afterPropertiesSet() throws IOException {

	        .....其它代码........
		this.sessionFactory = buildSessionFactory(sfb);
	}

	@Override //返回sessionFactory
	public SessionFactory getObject() {
		return this.sessionFactory;
	}
	.....其它代码........
}

 如果要得到FactoryBean 本身,加一个&,如下面的代码

//从这个FactoryBean中得到一个对象
System.out.println(act.getBean("sessionFactory"));
//如果要得到FactoryBean 本身,加一个&
System.out.println(act.getBean("&sessionFactory"));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值