Spring中FactoryBean的使用

通常情况下,spring根据配置信息生成bean,这些信息里面包含是否是单例、是否是懒加载等等。事实上我们还可以更灵活地控制bean,让它在使用的时候具备更多的特性。参考下面的代码,在springboot项目里面添加一个测试类:

public class DataService {
	public DataService()
	{
		System.out.println("DataService被实例化");
	}
	public void getData()
	{
		System.out.println("getData方法被调用");
	}
}

再添加一个FactoryBean类:

@Component
public class FactoryBeanTest implements FactoryBean<DataService> {

	@Override
	public DataService getObject() throws Exception {
		System.out.println("通过FactoryBeanTest得到DataService");
		return new DataService();
	}

	@Override
	public Class<?> getObjectType() {
		return DataService.class;
	}

	@Override
	public boolean isSingleton() {
		return false;
	}
}

DataService这个类并没有添加@component注解,但是并不妨碍spring自动注入,这是因为我们实现了一个FactoryBean的缘故。写如下测试代码:

public class Load {
	@Autowired
	DataService dataService1;
	@Autowired
	DataService dataService2;
	@PostConstruct
	public void start()
	{
		dataService1.getData();
		dataService2.getData();
	}
}

输入结果如下:

通过FactoryBeanTest得到DataService
DataService被实例化
通过FactoryBeanTest得到DataService
DataService被实例化
getData方法被调用
getData方法被调用

如果将isSingleton方法改为return true;那么输出结果则如下:

通过FactoryBeanTest得到DataService
DataService被实例化
getData方法被调用
getData方法被调用

由此可见FactoryBean的作用是丰富bean定义(丰富bean的生成过程是前后置处理器)的生成过程,同时减少bean的配置操作,在getObject方法里面你可以添加大量的功能性代码,这相比于普通的通过配置生成bean的方式,则灵活得多。

如果给DataService添加上注解@Component会这样呢,答案是会抛出异常:

Field dataService1 in study.example.Load required a single bean, but 2 were found:

在spring里面同一个类的bean只能有一个,我们上面这样做,会导致产生两个bean。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值