容器与bean
1. 容器接口
1). BeanFactory接口,典型功能有:
- getBean
2). ApplicationContext接口,是BeanFactory接口的子接口,它扩展了BeanFactory接口的功能:
- 国际化
- 通配符方式获取Resource资源
- 整合environment环境(能通过它获取各种来源的配置信息)
- 事件发布与监听,实现组件之间的解耦
@SpringBootApplication
public class A01 {
private static final Logger log = LoggerFactory.getLogger(A01.class);
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
ConfigurableApplicationContext context = SpringApplication.run(A01.class, args);
/*
1. 到底什么是 BeanFactory
- 它是 ApplicationContext 的父接口
- 它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能
*/
System.out.println(context);
/*
2. BeanFactory 能干点啥
- 表面上只有 getBean
- 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类提供
*/
Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
singletonObjects.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String, Object> map = (Map<String, Object>) singletonObjects.get(beanFactory);
map.entrySet().stream().filter(e -> e.getKey().startsWith("component"))
.forEach(e -> {
System.out.println(e.getKey() + "=" + e.getValue());
});
/*
3. ApplicationContext 比 BeanFactory 多点啥
*/
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));
Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource : resources) {
System.out.println(resource);
}
System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));
context.publishEvent(new UserRegisteredEvent(context));
}
}
debug上面代码,查看ApplicationContext对象:
1). 到底什么是BeanFactory
- 它是Application的父接口
- 它才是Spring的核心容器,主要是ApplicationContext实现都组合了它的功能,组合指的就是Application的一个重要成员变量就是BeanFactory
2). BeanFactory能干啥
- 表面是只有getBean
- 实际上控制反转,基本的依赖注入,bean的声明周期功能,都有它的实现类提供
3). Application比BeanFactory多点啥
- Application组合并扩展了BeanFactory的功能
- 国际化,通配符方式获取一组resource资源,整合environment环境, 时间发布和监听