-
BeanFactory
BeanFactory是Bean的工厂,Spring的顶层核心接口,它为Spring的IoC功能提供了基础,它使用了简单工厂,负责生产Bean,Bean的定义信息;
BeanFactory的类图如下:

-
ApplicationContext
从上面的类图可以看出ApplicationContext包含了BeanFactory的所有功能,ApplicationContext更值得推荐,除了一些特定的场景,例如在资源受限的设备上运行的内嵌的应用;
使用GenericApplicationContext及其子类AnnotationConfigApplicationContext作为自定义引导的常见实现, 这些是Spring用于所有常见目的的核心容器的主要入口点:加载配置文件,触发类路径扫描,以编程方式注册bean定义和带注解的类,以及(从5.0开始)注册功能bean定义;
从使用角度上说,ApplicationContext是面向用户的,它不仅能提供Bean和调用工厂生产Bean,还能提供一系列的服务(如国际化,加载Bean定义,监听器等);在ApplicationContext(例如GenericApplicationContext实现)中,按照约定(即通过bean名称或bean类型,特别是后处理器)检测到几种bean, 而普通的DefaultListableBeanFactory对任何特殊bean都是不可知的;

BeanFactory与ApplicationContext功能对比
| Feature |
| ApplicationContext |
|---|---|---|
| Bean Bean实例化/装配 | Yes | Yes |
| 集成的生命周期管理 | No | Yes |
自动注册 BeanPostProcessor |
No | Yes |
自动注册 BeanFactoryPostProcessor |
No | Yes |
便利的 MessageSource 访问 (国际化) |
No | Yes |
内置ApplicationEvent 发布机制 |
No | Yes |
-
FactoryBean
getObject 返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中; isSingleton 返回由FactoryBean创建的bean实例的作用域是singleton还是prototype; getObjectType 返回FactoryBean创建的bean类型;

FactoryBean实例化Bean的流程如下:

FactoryBean测试如下:
@Test
public void mainTest13() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
MainConfig10.class);
System.out.println("IOC容器创建完成...");
// 调用FactoryBean#getBean方法,入参为Bean id,得到的对象为FactoryBean#getObjectType的对象
// FactoryBean要获取工厂Bean本身,需要在id前加个&
// org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance
Object factoryBean1 = context.getBean("demoFactoryBean");
Object factoryBean2 = context.getBean("demoFactoryBean");
System.out.println("factoryBean1==factoryBean2 :" + (factoryBean1 == factoryBean2));
System.out.println("bean的类型:" + factoryBean1.getClass());
Object factoryBean3 = context.getBean("&demoFactoryBean");
System.out.println("bean的类型:" + factoryBean3.getClass());
}
@Configuration
public class MainConfig10 {
@Bean
public DemoFactoryBean demoFactoryBean() {
return new DemoFactoryBean();
}
}
public class DemoFactoryBean implements FactoryBean<Person> {
/**
* 是否单例进行控制
* @return
*/
@Override
public boolean isSingleton() {
return true;
}
/**
* 返回对象,把对象放到容器中
* @return
* @throws Exception
*/
@Override
public Person getObject() throws Exception {
return new Person();
}
/**
* 返回对象类型
* @return
*/
@Override
public Class<?> getObjectType() {
return Person.class;
}
}
执行结果如下:

参考:[https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanfactory]