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);//获取BeanFactoryConfigurableListableBeanFactory 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
- 变量名忽略大小写
事件发布功能
事件发布指南
- 事件发布的作用:解耦合