欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring中FactoryBean的使用

程序员文章站 2022-05-23 18:13:12
...

通常情况下,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。

相关标签: FactoryBean