Spring底层原理(一)
ApplitionContext
与BeanFactory
BeanFactory
是ApplicationContext
的父接口BeanFactory
才是Spring的核心容器,ApplicationContext
对其功能进行了组合
类图
内部方法调用
BeanFactory
的功能
- 获取bean
- 检查是否包含bean
- 获取bean别名
…
表面上只有getBean
,实际上控制反转、基本的依赖注入、直至Bean的生命周期的各种功能,都由它的实现类提供
🔖单例bean的管理(了解即可)
获取容器中的单例bean
@SpringBootApplication
public class SimpleApplication {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SimpleApplication.class, args);
Field field = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
field.setAccessible(true);
//获取BeanFactory
ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
Map<String, Object> map = (Map<String, Object>) field.get(beanFactory);
map.entrySet().stream().filter(e -> e.getKey().startsWith("component"))
.forEach(e -> {
System.out.println(e.getKey() + "=" + e.getValue());
});
}
}
ApplicationContext
的功能
ApplicationContext
除了可以对Bean管理外,还提供了如上四种功能
国际化功能
applicationContext.getMessage("msg", null, Locale.CHINA);
applicationContext.getMessage("msg", null, Locale.US);
applicationContext.getMessage("msg", null, Locale.JAPAN);
- 可以通过
applicationContext
提供的getMessage
方法对不同语言的资源文件进行读取
资源匹配功能
Resource[] resources = applicationContext.getResources("classpath:application.yml");
for (Resource resource : resources) {
System.out.println(resource);//class path resource [application.yml]
}
classpath
:获取类路径下的资源classpath*
:获取类路径下的资源包含jar包file
:获取文件系统下的资源
环境变量与配置文件读取功能
applicationContext.getEnvironment().getProperty("java_home");//C:\jdk-17
applicationContext.getEnvironment().getProperty("server.port");//8080
- 变量名忽略大小写
事件发布功能
事件发布指南
- 事件发布的作用:解耦合