Spring中的FactoryBean和BeanFactory
时间:2022-07-23
本文章向大家介绍Spring中的FactoryBean和BeanFactory,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
缘起
在spring的常见面试题中,经常会被问及FactoryBean和BeanFactory的区别与联系。这两个类虽然长得很像,但是他们的作用确实完全不像。其实这二者本就并没有什么关系,要是一定要说说关系,那或者就是二者都是一个接口吧。但要是说区别却能说出一大堆
- BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂,在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。
- FactoryBean 以Bean结尾,就是一个Bean,但这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。BeanFactory外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fj4cJo1T-1587805016676)(http://www.bxoon.com/upload/2020/3/image-2a976aeb208b449cb2927d9a606c27ee.png) 可以看到,对应BeanFactory来说,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖等等,反正就是对Bean的管理基本都靠他,但她是个接口,Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。FactoryBean外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhHVLiTl-1587805016678)(http://www.bxoon.com/upload/2020/3/image-0348b670bce84ee8a4434ce9df01ecc1.png) 可以看到在该接口中定义了以下3个方法:
- T getObject():返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
- boolean isSingleton():返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype;
- Class<T> getObjectType():返回FactoryBean创建的Bean类型。
那么这个类的使用场景是什么呢?一般情况下,Spring通过反射机制利用<bean>的class属性指定实现类实例化Bean,但这种实例化Bean的方式看起来似乎有点笨拙。我举一个简单的例子,比如你的项目里面需要根据一个参数来判定具体要实例化哪个Bean,Class A或者Class B. 那么你会怎么做呢?可能你会把这两个类都实例化出来,然后业务中根据参数来调用Class A or Class B。但更好的实现方式如下
public class C implements FactoryBean {
@Value("${icd.version}")
private String icdVersion;
@Override
public Object getObject() throws Exception {
if (xxx) {
return SpringManager.getBean(A.class);
} else{
return SpringManager.getBean(B.class);
}
}
@Override
public Class<?> getObjectType() {
//A和B的共同父类
return xxx.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
SpringManager
@Component
public class SpringManager implements ApplicationContextAware {
private static ApplicationContext context = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return context;
}
public static Object getBean(String name) {
return context.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
}
这样我们外面只需要用SpringManager.getBean(C)
的方式就可以获取到Class A or Class B了,完美。
- 设计模式六大原则(4):接口隔离原则
- 设计模式六大原则(3):依赖倒置原则
- 闲的无聊时候就手动写第一个漏洞扫描工具吧!
- 模拟退火算法从原理到实战【基础篇】
- python接口自动化3-自动发帖(session)
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
- python接口自动化4-绕过验证码登录(cookie)
- 洛谷P1313 计算系数【快速幂+dp】
- python接口自动化5-Json数据处理
- Numpy教程第1部分 - 阵列简介(常用基础操作总结)
- Session和Cookies的基本原理
- 浅析Numpy.genfromtxt及File I/O讲解
- 损失函数详解
- 排查Java的内存问题
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 详解python logging日志传输
- 将tf.batch_matmul替换成tf.matmul的实现
- Python正则表达式高级使用方法汇总
- CentOS7.0下安装PHP5.6.30服务的教程详解
- Laravel Validator自定义错误返回提示消息并在前端展示
- 完美解决keras 读取多个hdf5文件进行训练的问题
- keras:model.compile损失函数的用法
- PHP获取当前系统时间的方法小结
- PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
- php微信公众号开发之微信企业付款给个人
- PHP中抽象类,接口功能、定义方法示例
- YII分模块加载路由的实现方法
- PHP5.6读写excel表格文件操作示例
- php提取微信账单的有效信息
- PHP微信发送推送消息乱码的解决方法