BeanFactory 与 ApplicationContext
- 1.容器与 bean
- 1.BeanFactory 接口
- 2.ApplicationContext 接口
- 2.测试几个小案例
此篇代码在jdk11上正常运行,springBoot版本为2.7.14
1.容器与 bean
1.BeanFactory 接口
1.先看下源码:
2.从源码中的接口中可以得出结论:BeanFactory 主要就是处理Bean的,典型的功能有getBean();
2.ApplicationContext 接口
1.先看下源码:
2.ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能
3.看下结构图
2.测试几个小案例
1.debug看下启动类,我们可以看到BeanFactory 为ApplicationContext 的一个变量
2.测试获取spring.factories中的代码
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(DomeApplication.class, args);
Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource : resources) {
System.out.println(resource);
}
}
3.测试获取单例池
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(DomeApplication.class, args);
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);
});
}
4.测试监听
1.继承ApplicationEvent
public class jianting extends ApplicationEvent {
public jianting(Object source) {
super(source);
}
}
2.接收消息代码
@Component
public class test_shou {
@EventListener
public void aaa(jianting aa){
System.out.println(aa);
}
}
3.发消息
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(DomeApplication.class, args);
context.publishEvent(new jianting("发消息"));
}