# BeanFactory 与 ApplicationContext
什么是 BeanFactory
它是 ApplicationContext 的父接口
它是 Spring 的核心容器,主要的 ApplicationContext 实现都 “组合” 了它的功能
![image-20221128153459039]()
可以看到,ConfigurableApplicationContext 继承 ApplicationContext, 而 ApplicationContext 又继承了 BeanFactory
BeanFactory 能干什么
表面上只有 getBean
实际上控制反转,基本的依赖注入,直至 Bean 的生命周期的各种功能,都由它的实现类提供
![image-20221128154427849]()
ApplicationContext 比 BeanFactory 多点啥
ApplicationContext 继承了 MessageSource 接口,用于实现国际化
1
2
3System.out.println(context.getMessage("hi", null, Locale.CHINESE));
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
System.out.println(context.getMessage("hi", null, Locale.JAPANESE));![image-20221128162537724]()
ApplicationContext 继承了 ResourcePatternResolver 接口,用于根据通配符实现资源的加载
1
2
3
4Resource[] resources = context.getResources("classpath*:/META-INF/spring.factories");
for (Resource resource : resources) {
System.out.println(resource);
}ApplicationContext 继承了 EnvironmentCapable, 用以获取环境变量和配置信息
1
2System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));ApplicationContext 继承了 ApplicationEventPublisher, 用以实现事件的发送
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Component2 {
public static final Logger log = LoggerFactory.getLogger(Component2.class);
private ApplicationEventPublisher context;
public void register() {
System.out.println("我需要验证码!!! 现在发送订阅消息");
context.publishEvent(new UserRegisteredEvent(this));
System.out.println("ok了");
}
}
public class Component1 {
public static final Logger log = LoggerFactory.getLogger(Component1.class);
public void aaa(UserRegisteredEvent event) {
System.out.println("收到订阅消息, 立马发送验证码");
}
}



