容器接口
BeanFactory
-
是ApplicationContext的父接口,所有ApplicationContext的实现都组合了BeanFactory。
-
BeanFactory才是Spring的核心容器。
从BeanFactory提供的方法来看,主要是从容器中获取Bean。实际上控制反转,依赖注入以及Bean的生命周期管理,都由它的实现类提供。如下展示了BeanFactory其中一个实现类DefaultListableBeanFactory
的继承关系。
可以看到,它的继承路线上有一个DefaultSingletonBeanRegistry
类,这个类我们打开可以看到如下代码段,其中singletonObjects
对象正是容器中所有单例对象被保存的地方。
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); // 保存了所有的单例对象
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
...
}
ApplicationContext
ApplicationContext继承自多个接口,因此提供了多种能力,具体提供的能力如下代码所示。
@SpringBootApplication
public class SsmpApplication {
public static void main(String[] args) throws IOException {
final ConfigurableApplicationContext context = SpringApplication.run(SsmpApplication.class, args);
// MessageSource接口提供的功能,实现国际化能力
context.getMessage("hi", null, Locale.CHINA);
context.getMessage("hi", null, Locale.US);
// ResourcePatternResolver接口提供的能力,实现读取资源文件的能力
final Resource[] resources = context.getResources("classpath*:spring.factories");
// EnvironmentCapable接口提供的能力,实现获取环境参数的能力,可以获取环境变量、配置等
final String java_home = context.getEnvironment().getProperty("java_home");
final String port = context.getEnvironment().getProperty("server.port");
// ApplicationEventPublisher提供的能力,可以发送事件,实现解耦
context.publishEvent(new MyEvent(context));
}
public static class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
}
容器实现
BeanFactory实现
以下代码的注释中展示了BeanFactory是如何注册Bean的,以及注册后如何进行后处理的。
点击查看代码
package com.leo.ssmp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Collection;
@SpringBootApplication
@Slf4j
public class SsmpApplication {
public static void main(String[] args) {
// 将MyConfig类注册到BeanFactory中,由BeanFactory管理Bean的生成,销毁
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
final BeanDefinition configDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class)
.setScope("singleton")
.getBeanDefinition();
beanFactory.registerBeanDefinition("config", configDefinition);
// 向BeanFactory上注册一些后处理器,这些后处理器可