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。
推荐阅读
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
Android多线程处理机制中的Handler使用介绍
-
使用设计模式中的Singleton单例模式来开发iOS应用程序
-
iOS应用开发中使用设计模式中的观察者模式的实例
-
Android 中 Fragment的使用大全
-
详解iOS App开发中UIViewController的loadView方法使用
-
spring事务的@Transactional使用事务不生效问题
-
使用Python和xlwt向Excel文件中写入中文的实例
-
Python中Numpy ndarray的使用详解
-
Python中Numpy mat的使用详解