JAVA-面试官常问-BeanFactory和FactoryBean的区别

简介: JAVA-面试官常问-BeanFactory和FactoryBean的区别

前言

在Spring中有两个接口:BeanFactory和FactoryBean,乍一看,这哥俩是一个东西吗?好容易混淆啊。
目录

 

BeanFactory

BeanFactory是什么?

BeanFactory的结构

常见的使用场景
FactoryBean

FactoryBean是什么?

FactoryBean的结构

FactoryBean使用场景

二者的区别是什么?

BeanFactory

BeanFactory是什么?

BeanFactory是Spring中所有Bean容器的顶级接口,负责对Bean的创建、访问等工作

BeanFactory的结构 
BeanFactory定义了getBean()、containsBean()等管理Bean的通用方法

DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext这几个Spring的容器都是它的具体实现

常见的使用场景

1、从IOC容器中获取Bean


如context.getBean("aqiu")或context.getBean("aqiu",Bro.Class)


根据bean的名称,获取指定的bean实例。两个参数的方法中第二个方法是增加了一个类型的检验。


2、判断Bean是否为单例: context.isSingleton("aqiu")


3、检索IOC容器中是否包含指定的Bean: context.containsBean("aqiu")

FactoryBean

FactoryBean是什么?

FactoryBean是一个可生产Bean的工厂Bean,动态生成某一个类型的Bean的实例。

FactoryBean的结构

public interface FactoryBean<T> {
  /**
   * 从工厂中获取bean实例
   */
  T getObject() throws Exception;
  /**
   * 从工厂中获取bean实例对象的类型
   */
  Class<?> getObjectType();
  /**
   * 工厂创建的对象是否是单例
   */
  boolean isSingleton();
}

如果一个Bean实现了FactoryBean接口,那么这个Bean就变成了一个工厂,根据Bean的名称获取到的实际上是工厂调用getObject()返回的对象,而不是Bean本身,如果要获取工厂Bean自身的实例,那么需要在名称前面加上'&'符号。


getObject('name')返回工厂中的实例


getObject('&name')返回工厂本身的实例


FactoryBean使用场景

在Spring中最为典型的一个应用场景就是用来创建AOP的代理对象。


AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean。

二者的区别是什么?

BeanFactory是个Factory,是IOC容器。而FactoryBean就是个Bean,还是归BeanFactory管理。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。而FactoryBean这个Bean也不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。


相关文章
|
2天前
|
存储 Java
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
44 23
|
21小时前
|
前端开发 JavaScript Java
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
|
23小时前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季
|
22小时前
|
消息中间件 前端开发 Java
java面试刷题软件kafka和mq的区别面试
java面试刷题软件kafka和mq的区别面试
|
2天前
|
设计模式 API 数据格式
腾讯面试官问我适配器和桥接器的区别?
腾讯面试官问我适配器和桥接器的区别?
7 0
|
2天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
17 1
|
2天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
2天前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
36 3
|
2天前
|
安全 Java 编译器
Java中String、StringBuilder和StringBuffer的区别
Java中String、StringBuilder和StringBuffer的区别
10 1
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
24 0