BeanFactory
1. 到底什么是 BeanFactory
- 它是 ApplicationContext 的父接口
- 它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能
ConfigurableApplicationContext context = SpringApplication.run(A01.class, args);

context.getBean("aaa");

可以看到ApplicationContext组合了BeanFactory调用了BeanFactory的getBean方法
System.out.println(context);

2. BeanFactory 能干点啥
- 表面上只有 getBean
- 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类(DefaultListableBeanFactory)提供


Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
singletonObjects.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String, Object> map = (Map<String, Object>) singletonObjects.get(beanFactory);
map.forEach((k,v)->{
System.out.println(k + "=" + v);
});
//查看容器中所有的单例对象
ApplicationContext
3. ApplicationContext 比 BeanFactory 多点啥

MessageSource:处理国际化资源的能力
System.out.println(context.getMessage("hi", null, Locale.CHINA));
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
System.out.println(context.getMessage("hi", null, Locale.JAPANESE));
ResourcePatternResolver:通配符方式获取一组 Resource 资源
Resource[] resources = context.getResources("classpath*:META-INF/spring.factories"); //classpath* 到jar包里去找
for (Resource resource : resources) {
System.out.println(resource);
}
ApplicationEventPulisher:事件发布与监听
public class UserRegisteredEvent extends ApplicationEvent {
public UserRegisteredEvent(Object source) {
super(source);
}
}
@Component
public class Component2 {
private static final Logger log = LoggerFactory.getLogger(Component2.class);
@EventListener
public void aaa(UserRegisteredEvent event) {
log.debug("{}", event);
log.debug("发送短信");
}
}
context.publishEvent(new UserRegisteredEvent(context));
不支持分布式,还是用mq吧
EnvironmentCapable:整合 Environment 环境
System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));