AbstractApplicationContext
类的代码
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
}
}
Spring 容器的refresh();创建刷新
1.prepareRefresh();
刷新前的预处理
protected void prepareRefresh() {
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if (logger.isInfoEnabled()) {
logger.info("Refreshing " + this);
}
// Initialize any placeholder property sources in the context environment
//初始化一些属性设置;子类自定义个性化的属性设置方法。实现 继承AbstractApplicationContext 即可
initPropertySources();
// Validate that all properties marked as required are resolvable
// see ConfigurablePropertyResolver#setRequiredProperties
//校验属性的合法性
getEnvironment().validateRequiredProperties();
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
//用来保存容器事件
this.earlyApplicationEvents = new LinkedHashSet<>();
}
2. obtainFreshBeanFactory();
获取BeanFactory
-
refreshBeanFactory();
刷新创建BeanFactory
-
getBeanFactory()
返回GenericApplicationContext
创建的BeanFactory
对象 - 将创建的
BeanFactory
对象 (DefaultListableBeanFactory
)返回
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
//进入`GenericApplicationContext`类
//构造对象的时候创建 DefaultListableBeanFactory 对象
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
@Override
protected final void refreshBeanFactory() throws IllegalStateException {
if (!this.refreshed.compareAndSet(false, true)) {
throw new IllegalStateException(
"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
}
//
this.beanFactory.setSerializationId(getId());
}
3. prepareBeanFactory(beanFactory);
BeanFactory
的预准备工作(对BeanFactory
进行一些设置)
1. beanFactory.setBeanClassLoader(getClassLoader());
添加类加载器
2. 添加一些不嫩beanpostprocessor
3. 设置忽略的自动装备的接口, 实现这些接口的实现类不能通过接口类型进行注入
@Component
public class Dog implements ApplicationContextAware {}
//上面组件是不允许下面这样子注入
@Autowired
private ApplicationContextAware applicationContextAware;
4. 注册可以解析的自动装配:我们能在任何组件中自动注入BeanFactory
,ResourceLoader
,ApplicationEventPublisher
,ApplicationContext
.意思就是以上组件可以直接使用@Autowired
注解,也可通过实现 xxxaware 接口来实现功能。
image.png
使用了 @Autowired 可以注入
image.png
没有注入为空
image.png
5. 添加BeanPostProcessor
(ApplicationListenerDetector
)
6. 添加编译时AspectJ
7. 给BeanFactory中注册一些能用的组件 environment
[ConfigurableEnvironment
],systemProperties
[Map<String, Object>
],systemEnvironment
[Map<String, Object>
]
可以从容器中获取
applicationContext.getEnvironment().getSystemProperties();
在组件总也可以直接注入
image.png
image.png
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
//添加 ApplicationContextAwareProcessor
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//设置忽略的自动装备的接口
// 实现这些接口的实现类不能通过接口类型进行注入
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
// BeanFactory interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
//在组件中可以自动注入 的
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// Register early post-processor for detecting inner beans as ApplicationListeners.
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// Detect a LoadTimeWeaver and prepare for weaving, if found.
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// Register default environment beans.
//给BeanFactory中注册一些能用的组件
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
4. postProcessBeanFactory(beanFactory);
BeanFactory
准备完成后进行后置处理。子类可以重写这个方法类来在BeanFactory
创建并与准备完成以后做进一步的设置。
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}