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 区别的更多相关文章

  1. Spring之BeanFactory和FactoryBean接口的区别

    目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @   Spring框架中的BeanFactory ...

  2. Spring中的BeanFactory与FactoryBean看这一篇就够了

    前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如 ...

  3. Spring高级特性之四:FactoryBean和BeanFactory

    FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...

  4. 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。

    前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...

  5. Spring @Configuration 和 @Component 区别

    Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个 ...

  6. 转:Spring系列之beanFactory与ApplicationContext

    原文地址:Spring系列之beanFactory与ApplicationContext 一.BeanFactoryBeanFactory 是 Spring 的“心脏”.它就是 Spring IoC ...

  7. 转:Spring FactoryBean源码浅析

    http://blog.csdn.net/java2000_wl/article/details/7410714 在Spring BeanFactory容器中管理两种bean 1.标准Java Bea ...

  8. Spring与SpringMVC的区别

    Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring. 简单点的话可以将SpringMVC类比于Strut ...

  9. spring 简单实现BeanFactory(转)

    原文地址: http://blog.csdn.net/mlc1218559742/article/details/52776160 有没有发现上面的代码与利用反射实现工厂模式的代码很相似.对,你没有看 ...

随机推荐

  1. (转)如何优雅的使用rabbit mq

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  2. [云计算] OpenStack 发展史

    传统数据中心面临的问题 无法管理,资源利用率不高 资源分配不合理 初始成本高 发展阶段 IDC 托管/租用 VPS(虚拟专用主机/OpenVZ/XEN) 虚拟主机 云主机 虚拟化 服务器虚拟化 KVM ...

  3. [刷题] 300 Longest Increasing Subsequence

    要求 给定一个整数序列,求其中的最长上升子序列长度 子序列元素可不相邻 元素相等不算上升 一个序列可能有多个最长上升子序列,但最长的长度只有一个 思路 暴力解法:选择所有子序列进行判断((2^n)*n ...

  4. 【CentOS_7】使用tcpdump抓明文包

    tcpdump port 12345 -X -X:以十六进制与ASCII方式输出,用于抓取http等明文传输协议 tcpdump功能强大,更多参数可以参考  https://www.cnblogs.c ...

  5. python文件对象几种操作模式区别——文件操作方法详解

    文件对象的字节模式/b模式(以utf-8编码为例) 读操作 写操作 指针操作 ASCII字节 返回bytes/字节类型的Ascii 写入bytes类型字节 例如:b'This is ascii' 使用 ...

  6. Python socket 编程实验

    实验内容 1.编写一个基于UDP协议的客户机与服务器程序,实现相互通讯. 2.编写一个基于TCP协议的客户机与服务器程序,实现相互通讯. 3.捕获以上两种通讯的数据包,使用Wireshark进行分析, ...

  7. Linux_配置认证访问FTP服务

    [RHEL8]-FTPserver:[Centos8]-FTPclient !!!测试环境我们首关闭防火墙和selinux(FTPserver和FTPclient都需要) [root@localhos ...

  8. 列出 Ubuntu 和 Debian 上已安装的软件包

    列出 Ubuntu 和 Debian 上已安装的软件包 如果你经常用 apt 命令,你可能觉得会有个命令像 apt 一样可以列出已安装的软件包.不算全错. apt-get 命令 没有类似列出已安装软件 ...

  9. linux进阶之计划任务及压缩归档

    本节内容 1. at一次性计划任务(atd) at 时间点 command ctrl+d:保存 -l:查看计划任务 atrm:删除计划任务 atq:查看计划任务 2. crontab周期性计划任务(c ...

  10. C++对象内存分布详解(包括字节对齐和虚函数表)

    转自:https://www.jb51.net/article/101122.htm 1.C++对象的内存分布和虚函数表: C++对象的内存分布和虚函数表注意,对象中保存的是虚函数表指针,而不是虚函数 ...