Spring之容中的工厂Bean

本文介绍了Spring框架中的FactoryBean接口及其应用场景。FactoryBean是一种特殊的Bean,它必须实现FactoryBean接口,并可以自定义创建对象的方式。文章还提供了一个具体的实现示例,并展示了如何在Spring配置文件中使用FactoryBean。

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

这里说的工厂Bean是Spring的一种特殊Bean,这种工厂Bean必须实现FactoryBean接口。FactoryBean接口是工厂Bean的标准接口,把工厂Bean(实现FactoryBean接口的Bean)部署在容器中之后,如果程序通过getBean()方法来获取它时,容器返回的不是FactoryBean实现类的实例,而是返回FactoryBean的产品(即该工厂Bean的getObject()方法的返回值)。FactoryBean接口提供如下三个方法:

1)        T getObject():实现该方法负责返回工厂Bean生成的Java实例。

2)        Class<?> getObjectType():实现该方法返回该工厂Bean生成的Java实例的实现类。

3)        boolean isSingleton():实现该方法表示该方法工厂Bean生成的Java实例是否为单例模式。

下面定义一个简单标准的工厂Bean,穿上工厂Bean实现了FactoryBean接口。

public class GetFieldFactoryBean implements FactoryBean<Object>
{
	private String targetClass;
	private String targetField;
	// targetClass的setter方法
	public void setTargetClass(String targetClass)
	{
		this.targetClass = targetClass;
	}

	// targetField的setter方法
	public void setTargetField(String targetField)
	{
		this.targetField = targetField;
	}
	// 返回工厂Bean所生产的产品
	public Object getObject() throws Exception
	{
		Class<?> clazz = Class.forName(targetClass);
		Field field = clazz.getField(targetField);
		return field.get(null);
	}
	// 获取工厂Bean所生产的产品的类型
	public Class<? extends Object> getObjectType()
	{
		return Object.class;
	}
	// 返回该工厂Bean所生成的产品是否为单例
	public boolean isSingleton()
	{
		return false;
	}
}

下面配置文件将使用GetFieldFactoryBean来获取定义类、指定静态Field的值

 <?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<!-- 下面配置相当于如下代码:
	FactoryBean factory = new org.crazyit.app.factory.GetFieldFactoryBean();
	factory.setTargetClass("java.awt.BorderLayout");
	factory.setTargetField("NORTH");
	north = factory.getObject(); -->
	<bean id="north" class="org.crazyit.app.factory.GetFieldFactoryBean">
		<property name="targetClass" value="java.awt.BorderLayout"/>
		<property name="targetField" value="NORTH"/>
	</bean>
	<!-- 下面配置相当于如下代码:
	FactoryBean factory = new org.crazyit.app.factory.GetFieldFactoryBean();
	factory.setTargetClass("java.sql.ResultSet");
	factory.setTargetField("TYPE_SCROLL_SENSITIVE");
	north = factory.getObject(); -->
	<bean id="theValue" class="org.crazyit.app.factory.GetFieldFactoryBean">
		<property name="targetClass" value="java.sql.ResultSet"/>
		<property name="targetField" value="TYPE_SCROLL_SENSITIVE"/>
	</bean>
</beans>

 Spring容器会自动检测容器中的所有Bean,如果发现某个Bean实现类实现了FactoryBean接口,Spring容器就会在实例化该Bean、根据<property…/>执行setter方法之后,额外调用 Bean的getObject()方法,并将该方法的返回值作为容器中的Bean。

下面程序示范了获取容器中的FactoryBean的产品。

public class SpringTest
{
	public static void main(String[] args)throws Exception
	{
		ApplicationContext ctx = new
			ClassPathXmlApplicationContext("beans.xml");
		// 下面2行代码获取的FactoryBean的产品
		System.out.println(ctx.getBean("north"));
		System.out.println(ctx.getBean("theValue"));
		// 下面代码可获取的FactoryBean本身
		System.out.println(ctx.getBean("&theValue"));
	}
}

获取的结果是:

North

1005

com.owen.app.factory.GetFieldFactoryBean@490ab905

实际上,FactoryBean是Spring中非常有用的一个接口,Spring内置提供了很多实用的工厂Bean,例如TransactionproxyFactoryBean等,这个工厂Bean专门用于为目标Bean创建事务代理。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值