Spring FactoryBean和BeanFactory 区别
1 BeanFactory 是ioc容器的底层实现接口,是ApplicationContext 顶级接口
spring不允许我们直接操作 BeanFactory bean工厂,所以为我们提供了ApplicationContext 这个接口 此接口集成BeanFactory 接口,ApplicationContext包含BeanFactory的所有功能,同时还进行更多的扩展。
BeanFactory 接口又衍生出以下接口,其中我们经常用到的是ApplicationContext 接口
ApplicationContext 继承图
CongihuableApplicationContext 中添加了一些方法:
... 其他省略 //刷新ioc容器上下文
void refresh() throws BeansException, IllegalStateException; // 关闭此应用程序上下文,释放所有资源并锁定,销毁所有缓存的单例bean。
@Override
void close(); //确定此应用程序上下文是否处于活动状态,即,是否至少刷新一次且尚未关闭。
boolean isActive(); ... 其他省略
主要作用在ioc容器进行相应的刷新,关闭等操作!
FileSystemXmlApplicationContext 和ClassPathXmlApplicationContext 是用来读取xml文件创建bean对象
ClassPathXmlApplicationContext : 读取类路径下xml 创建bean
FileSystemXmlApplicationContext :读取文件系统下xml创建bean
AnnotationConfigApplicationContext 主要是注解开发获取ioc中的bean实例
2 FactoryBean 是spirng提供的工厂bean的一个接口
FactoryBean 接口提供三个方法,用来创建对象,
FactoryBean 具体返回的对象是由getObject 方法决定的。
*/
public interface FactoryBean<T> { //创建的具体bean对象的类型
@Nullable
T getObject() throws Exception; //工厂bean 具体创建具体对象是由此getObject()方法来返回的
@Nullable
Class<?> getObjectType(); //是否单例
default boolean isSingleton() {
return true;
} }
创建一个FactoryBean 用来生产User对象
@Component
public class FactoryBeanTest implements FactoryBean<User> { //创建的具体bean对象的类型
@Override
public Class<?> getObjectType() {
return User.class;
} //是否单例
@Override
public boolean isSingleton() {
return true;
} //工厂bean 具体创建具体对象是由此getObject()方法来返回的
@Override
public User getObject() throws Exception {
return new User();
}
}
Junit测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {FactoryBeanTest.class})
@WebAppConfiguration
public class SpringBootDemoApplicationTests {
@Autowired
private ApplicationContext applicationContext; @Test
public void tesst() {
FactoryBeanTest bean1 = applicationContext.getBean(FactoryBeanTest.class);
try {
User object = bean1.getObject();
System.out.println(object==object);
System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果
true
User [id=null, name=null, age=0]
简单的总结:
BeanFactory是个bean 工厂,是一个工厂类(接口), 它负责生产和管理bean的一个工厂
是ioc 容器最底层的接口,是个ioc容器,是spring用来管理和装配普通bean的ioc容器(这些bean成为普通bean)。
FactoryBean是个bean,在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式,是一个可以生产对象和装饰对象的工厂bean,由spring管理后,
生产的对象是由getObject()方法决定的(从容器中获取到的对象不是
“ FactoryBeanTest ” 对象)。
Spring FactoryBean和BeanFactory 区别的更多相关文章
- Spring之BeanFactory和FactoryBean接口的区别
目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @ Spring框架中的BeanFactory ...
- Spring中的BeanFactory与FactoryBean看这一篇就够了
前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如 ...
- Spring高级特性之四:FactoryBean和BeanFactory
FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...
- 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...
- Spring @Configuration 和 @Component 区别
Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个 ...
- 转:Spring系列之beanFactory与ApplicationContext
原文地址:Spring系列之beanFactory与ApplicationContext 一.BeanFactoryBeanFactory 是 Spring 的“心脏”.它就是 Spring IoC ...
- 转:Spring FactoryBean源码浅析
http://blog.csdn.net/java2000_wl/article/details/7410714 在Spring BeanFactory容器中管理两种bean 1.标准Java Bea ...
- Spring与SpringMVC的区别
Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring. 简单点的话可以将SpringMVC类比于Strut ...
- spring 简单实现BeanFactory(转)
原文地址: http://blog.csdn.net/mlc1218559742/article/details/52776160 有没有发现上面的代码与利用反射实现工厂模式的代码很相似.对,你没有看 ...
随机推荐
- MongonDb在thinkphp中常用的功能整理
1.以某字段开头的数据查询条件 $title = input('param.title'); $where['title'] = new \MongoDB\BSON\Regex("^{$ti ...
- Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试
前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...
- (转)解决c#自带的HttpClient(Http.GetFromJsonAsync Http.GetStringAsync等)返回中文乱码问题
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var aa = await Http.GetByteArrayAsync ...
- 测试报告$\alpha$
pytorch可视化编程网站VisualPytorch NAG \(\alpha\)版本发布了!点击网址访问:VisualPytorch 一.测试查虫(bug detection) 测试贯穿了开发.集 ...
- Duplicate entry '' for key 'PRIMARY'
今天在在mysql中插入数据 因为直接插入查询出来的表格,insert into 表(student_id,class_id) 直接插入了这两个字段对应的查询出来的表 没有留意到该表的主键没有设置自增 ...
- Iterable 和 Iterator
可以被for循环输出的为iterable (可迭代对象) 可以被next()调用并不断返回下一个数据的对象为iterator迭代器(python一切皆对象) 数据流,无法知晓其终点,只能推过next不 ...
- [bug] TypeError : unsupported operand type(s) for += : 'NoneType' and 'int'
原因 Flask购物网站中,每点击货物一次,数据库中货物的浏览次数+1,默认浏览次数为NULL,故无法完成运算 解决 将数据库中相应字段默认值设为0,注意要先断开数据库连接
- 折腾gcc/g++链接时.o文件及库的顺序问题
gcc/g++链接时.o文件以及库的顺序问题 1 写在前面 最近换了xubuntu12.4,把原来的项目co出来编译的时候报"undefined reference to".猜测是 ...
- python中类属性和数据属性的解释
python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...
- ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)
@ 目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 本教程<ArcGIS从入门到精通系列实验教程>内容包括:ArcGIS平台简介.ArcGIS应用基础.空间数据的采集 ...