Demo
代码十分简单,整个工程结构以下:
pom
依赖<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
复制代码
OrderService
、UserService
只加了@Service
注解,dao包下的两个类OrderDao
、UserDao
只加了@Repository
注解。MainApplication
类中只写main()
方法。代码以下:public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
System.out.println(userService);
OrderService orderService = applicationContext.getBean(OrderService.class);
System.out.println(orderService);
UserDao userDao = applicationContext.getBean(UserDao.class);
System.out.println(userDao);
OrderDao orderDao = applicationContext.getBean(OrderDao.class);
System.out.println(orderDao);
applicationContext.close();
}
复制代码
AppConfig
类是一个配置类,类上加了两个注解,加@Configuration
代表AppConfig
是一个配置类,加@ComponentScan
是为了告诉Spring
要扫描哪些包,代码以下:@Configuration
@ComponentScan("com.tiantang.study")
public class AppConfig {
}
复制代码
MainApplication
中的main()
方法,这样一个Spring
容器就运行起来了。控制台分别打印出了UserService
、OrderService
、UserDao
、OrderDao
的hash
码。xml
配置的方式,如今就这么几行简单的代码,一个Spring
容器就能运行起来,咱们就能从容器中获取到Bean
,Spring
内部是如何作到的呢?下面就来逐步分析Spring
启动的源码。main()
方法,从代码中能够发现,核心代码只有一行,new AnnotationConfigApplicationContext(AppConfig.class)
,经过这一行代码,就将Spring
容器给建立完成,而后咱们就能经过getBean()
从容器中获取到对象的了。所以,分析Spring
源码,就从AnnotationConfigApplicationContext
的有参构造函数开始。AnnotationConfigApplicationContext
与ClassPathXmlApplicationContext
做用同样,前者对应的是采用JavaConfig
技术的应用,后者对应的是XML
配置的应用Spring
源码阅读以前,须要先理解几个概念。Spring
会将全部交由Spring
管理的类,扫描其class
文件,将其解析成BeanDefinition
,在BeanDefinition
中会描述类的信息,例如:这个类是不是单例的,Bean
的类型,是不是懒加载,依赖哪些类,自动装配的模型。Spring
建立对象时,就是根据BeanDefinition
中的信息来建立Bean
。Spring
容器在本文能够简单理解为DefaultListableBeanFactory
,它是BeanFactory
的实现类,这个类有几个很是重要的属性:beanDefinitionMap
是一个map
,用来存放bean
所对应的BeanDefinition
;beanDefinitionNames
是一个List
集合,用来存放全部bean
的name
;singletonObjects
是一个Map
,用来存放全部建立好的单例Bean
。Spring
中有不少后置处理器,但最终能够分为两种,一种是BeanFactoryPostProcessor
,一种是BeanPostProcessor
。前者的用途是用来干预BeanFactory
的建立过程,后者是用来干预Bean
的建立过程。后置处理器的做用十分重要,bean
的建立以及AOP
的实现所有依赖后置处理器。AnnotationConfigApplicationContext
的构造函数的参数,是一个可变数组,能够传多个配置类,在本次Demo
中,只传了AppConfig
一个类。this()
,在this()
中经过调用父类构造器初始化了BeanFactory
,以及向容器中注册了7个后置处理器。而后调用register()
,将构造方法的参数放入到BeanDefinitionMap
中。最后执行refresh()
方法,这是整个Spring
容器启动的核心,本文也将重点分析refresh()
方法的流程和做用。public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// 会初始化一个BeanFactory,为默认的DefaultListableBeanFactory
// 会初始化一个beanDefinition的读取器,同时向容器中注册了7个spring的后置处理器(包括BeanPostProcessor和BeanFactoryPostProcessor)
// 会初始化一个扫描器,后面彷佛并无用到这个扫描器,在refresh()中使用的是从新new的一个扫描器。
this();
// 将配置类注册进BeanDefinitionMap中
register(annotatedClasses);
refresh();
}
复制代码
this()
会调用AnnotationConfigApplicationContext
无参构造方法,而在Java
的继承中,会先调用父类的构造方法。因此会先调用AnnotationConfigApplicationContext
的父类GeniricApplicationContext
的构造方法,在父类中初始化beanFactory
,即直接new
了一个DefaultListableBeanFactory
。public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
复制代码
this()
中经过new AnnotatedBeanDefinitionReader(this)
实例化了一个Bean
读取器,并向BeanDefinitionMap
中添加了7
个元素。经过new ClassPathBeanDefinitionScanner(this)
实例化了一个扫描器(该扫描器在后面并无用到)。public AnnotationConfigApplicationContext() {
// 此处会先调用父类的构造器,即先执行 super(),初始化DefaultListableBeanFactory
// 初始化了bean的读取器,并向spring中注册了7个spring自带的类,这里的注册指的是将这7个类对应的BeanDefinition放入到到BeanDefinitionMap中
this.reader = new AnnotatedBeanDefinitionReader(this);
// 初始化扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
复制代码
this.reader = new AnnotatesBeanDefinitionReader(this)
时,最后会调用到AnnotationConfigUtils.registerAnnotationConfigProcessors(BeanDefinitionRegistry registry,Object source)
方法,这个方法向BeanDefinitionMap
中添加了7
个类,这7
个类的BeanDefinition
(关于BeanDefinition
的介绍能够参考前面的解释)均为RootBeanDefinition
,这几个类分别为ConfigurationClassPostProcessor
、AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
、RequiredAnnotationBeanPostProcessor
、PersistenceBeanPostProcessor
、EventListenerMethodProcessor
、DefaultEventListenerFactory
。ConfigurationClassPostProcessor
、AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
这三个类很是重要,这里先在下面代码中简单介绍了一下做用,后面会单独写文章分析它们的做用。本文的侧重点是先介绍完Spring
启动的流程。public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, @Nullable Object source) {
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
// 省略部分代码 ...
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
// 注册ConfigurationClassPostProcessor,这个类超级重要,它完成了对加了Configuration注解类的解析,@ComponentScan、@Import的解析。
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册AutowiredAnnotationBeanPostProcessor,这个bean的后置处理器用来处理@Autowired的注入
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册RequiredAnnotationBeanPostProcessor
if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册CommonAnnotationBeanPostProcessor,用来处理如@Resource,@PostConstruct等符合JSR-250规范的注解
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册PersistenceAnnotationBeanPostProcessor,来用支持JPA
// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册EventListenerMethodProcessor,用来处理方法上加了@EventListener注解的方法
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
// 注册DefaultEventListenerFactory,暂时不知道干啥用的,从类名来看,是一个事件监听器的工厂
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
复制代码
this.scanner = new ClassPathBeanDefinitionScanner(this)
来初始化一个扫描器,这个扫描器在后面扫描包的时候,并无用到,猜想是Spring
为了知足其余的场景而初始化的,例如: 开发人员手动经过register(configClass)
时,扫描包时使用的。将传入的配置类
annotatedClasses
解析成BeanDefinition
(实际类型为AnnotatedGenericBeanDefinition
),而后放入到BeanDefinitionMap
中,这样后面在ConfigurationClassPostProcessor
中能解析annotatedClasses
,例如demo
中的AppConfig
类,只有解析了AppConfig
类,才能知道Spring
要扫描哪些包(由于在AppConfig
类中添加了@ComponentScan
注解),只有知道要扫描哪些包了,才能扫描出须要交给Spring
管理的bean
有哪些,这样才能利用Spring
来建立bean
。java
refresh()
方法是整个Spring
容器的核心,在这个方法中进行了bean
的实例化、初始化、自动装配、AOP
等功能。下面先看看refresh()
方法的代码,代码中加了部分我的的理解,简单介绍了每一行代码做用,后面会针对几个重要的方法作出详细分析git
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
// 初始化属性配置文件、检验必须属性以及监听器
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 给beanFactory设置序列化id
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 向beanFactory中注册了两个BeanPostProcessor,以及三个和环境相关的bean
// 这两个后置处理器为ApplicationContextAwareProcessor和ApplicationListenerDetector
// 前一个后置处理是为实现了ApplicationContextAware接口的类,回调setApplicationContext()方法,
// 后一个处理器时用来检测ApplicationListener类的,当某个Bean实现了ApplicationListener接口的bean被建立好后,会被加入到监听器列表中
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
// 空方法,由子类实现
postProcessBeanFactory(beanFactory);
// 执行全部的BeanFactoryPostProcessor,包括自定义的,以及spring内置的。默认状况下,容器中只有一个BeanFactoryPostProcessor,即:Spring内置的,ConfigurationClassPostProcessor(这个类很重要)
// 会先执行实现了BeanDefinitionRegistryPostProcessor接口的类,而后执行BeanFactoryPostProcessor的类
// ConfigurationClassPostProcessor类的postProcessorBeanFactory()方法进行了@Configuration类的解析,@ComponentScan的扫描,以及@Import注解的处理
// 通过这一步之后,会将全部交由spring管理的bean所对应的BeanDefinition放入到beanFactory的beanDefinitionMap中
// 同时ConfigurationClassPostProcessor类的postProcessorBeanFactory()方法执行完后,向容器中添加了一个后置处理器————ImportAwareBeanPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 注册全部的BeanPostProcessor,由于在方法里面调用了getBean()方法,因此在这一步,实际上已经将全部的BeanPostProcessor实例化了
// 为何要在这一步就将BeanPostProcessor实例化呢?由于后面要实例化bean,而BeanPostProcessor是用来干预bean的建立过程的,因此必须在bean实例化以前就实例化全部的BeanPostProcessor(包括开发人员本身定义的)
// 最后再从新注册了ApplicationListenerDetector,这样作的目的是为了将ApplicationListenerDetector放入到后置处理器的最末端
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
// 初始化MessageSource,用来作消息国际化。在通常项目中不会用到消息国际化
initMessageSource();
// Initialize event multicaster for this context.
// 初始化事件广播器,若是容器中存在了名字为applicationEventMulticaster的广播器,则使用该广播器
// 若是没有,则初始化一个SimpleApplicationEventMulticaster
// 事件广播器的用途是,发布事件,而且为所发布的时间找到对应的事件监听器。
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
// 执行其余的初始化操做,例如和SpringMVC整合时,须要初始化一些其余的bean,可是对于纯spring工程来讲,onFresh方法是一个空方法
onRefresh();
// Check for listener beans and register them.
// 这一步会将自定义的listener的bean名称放入到事件广播器中
// 同时还会将早期的ApplicationEvent发布(对于单独的spring工程来讲,在此时不会有任何ApplicationEvent发布,可是和springMVC整合时,springMVC会执行onRefresh()方法,在这里会发布事件)
registerListeners();
// 实例化剩余的非懒加载的单例bean(注意:剩余、非懒加载、单例)
// 为何说是剩余呢?若是开发人员自定义了BeanPosrProcessor,而BeanPostProcessor在前面已经实例化了,因此在这里不会再实例化,所以这里使用剩余一词
finishBeanFactoryInitialization(beanFactory);
// 结束refresh,主要干了一件事,就是发布一个事件ContextRefreshEvent,通知你们spring容器refresh结束了。
finishRefresh();
}
catch (BeansException ex) {
// 出异常后销毁bean
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// 在bean的实例化过程当中,会缓存不少信息,例如bean的注解信息,可是当单例bean实例化完成后,这些缓存信息已经不会再使用了,因此能够释放这些内存资源了
resetCommonCaches();
}
}
}
复制代码
refresh()
方法中,比较重要的方法为invokeBeanFactoryPostProcessors(beanFactory)
和 finishBeanFactoryInitialization(beanFactory)
。其余的方法相对而言比较简单,下面主要分析这两个方法,其余方法的做用,能够参考上面源码中的注释。BeanFactoryPostProcessor
,因为Spring
会内置一个BeanFactoryPostProcessor
,即ConfigurationClassPostProcessor
(若是开发人员不自定义,默认状况下只有这一个BeanFactoryPostProcessor
),这个后置处理器在处理时,会解析出全部交由Spring
容器管理的Bean
,将它们解析成BeanDefinition
,而后放入到BeanFactory
的BeanDefinitionMap
中。PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
方法,主要做用是执行全部BeanFactoryPostProcessor
的postProcessorBeanFactory()
方法。BeanFactoryPostProcessor
又分为两种状况,一种是直接实现BeanFactoryPostProcessor
接口的类,另外一种状况是实现了BeanDefinitionRegistryPostProcessor
接口(BeanDefinitionRegistryPostProcessor
继承了BeanFactoryPostProcessor
接口)。
BeanDefinitionRegistryPostProcessor
的postProcessorBeanDefinitionRegistry()
方法,而后再执行BeanFacotryPostProcessor
的postProcessorBeanFactory()
方法。public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
复制代码
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
复制代码
Spring
有一个内置的BeanFactoryPostProcessor
,即:ConfigurationClassPostProcessor
类,该类实现了BeanDefinitionRegistryPostProcessor
类,因此会执行ConfigurationClassPostProcessor.postProcessorBeanDefinitionRegistry
,ConfigurationClassPostProcessor
的UML
图如上(删减了部分不重要的继承关系)BeanPostProcessor
,而后将这些BeanPostProcessor
实例化(会调用getBean()
方法,getBean()
方法的主要逻辑是,若是bean
存在于BeanFactory
中,则返回bean
;若是不存在,则会去建立。在后面会仔细分析getBean()
的执行逻辑)。将这些PostProcessor
实例化后,最后放入到BeanFactory
的beanPostProcessors
属性中。BeanPostProcessor
? 包括Spring
内置的和开发人员自定义的。refresh()
方法中,会先执行完invokeBeanFactoryPostProcessor()
方法,这样全部自定义的BeanPostProcessor
类均已经被扫描出并解析成BeanDefinition
(扫描和解析又是谁作的呢?ConfigurationClassPostProcessor
作的),存入至BeanFactory
的BeanDefinitionMap
,因此这儿能经过方法以下一行代码找出全部的BeanPostProcessor
,而后经过getBean()
所有实例化,最后再将实例化后的对象加入到BeanFactory
的beanPostProcessors
属性中,该属性是一个List
集合。String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
复制代码
ApplicationListenerDetector
,这样作的目的是为了将ApplicationListenerDetector
放入到后置处理器的最末端registerBeanPostProcessor()
最终调用的是PostProcessorRegistrationDelegate.registerBeanPostProcessors()
,下面是PostProcessorRegistrationDelegate.registerBeanPostProcessors()
方法的代码public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 从BeanDefinitionMap中找出全部的BeanPostProcessor
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// ... 省略部分代码 ...
// 分别找出实现了PriorityOrdered、Ordered接口以及普通的BeanPostProcessor
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 此处调用了getBean()方法,所以在此处就会实例化出BeanPostProcessor
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, register the BeanPostProcessors that implement PriorityOrdered.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 将实现了PriorityOrdered接口的BeanPostProcessor添加到BeanFactory的beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 下面这部分代码与上面的代码逻辑一致,是将实现了Ordered接口以及普通的BeanPostProcessor实例化以及添加到beanPostProcessors结合中,逻辑与处理PriorityOrdered的后置处理器同样
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
// 最后将ApplicationListenerDetector这个后置处理器同样从新放入到beanPostProcessor中,这样作的目的是为了将其放入到后置处理器的最末端
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
复制代码
BeanPostProcessor
存在优先级,实现了PriorityOrdered
接口的优先级最高,其次是Ordered
接口,最后是普通的BeanPostProcessor
。优先级最高的,会最早放入到beanPostProcessors
这个集合的最前面,这样在执行时,会最早执行优先级最高的后置处理器(由于List
集合是有序的)。BeanPostProcessor
执行,则可让其实现PriorityOrdered
接口或者Ordered
接口。该方法初始化了一个事件广播器,若是容器中存在了
beanName
为applicationEventMulticaster
的广播器,则使用该广播器;若是没有,则初始化一个SimpleApplicationEventMulticaster
。该事件广播器是用来作应用事件分发的,这个类会持有全部的事件监听器(ApplicationListener
),当有ApplicationEvent
事件发布时,该事件监听器能根据事件类型,检索到对该事件感兴趣的ApplicationListener
。github
initApplicationEventMulticaster()
方法的源码以下(省略了部分日志信息):protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 判断spring容器中是否已经存在beanName = applicationEventMulticaster的事件广播器
// 例如:若是开发人员本身注册了一个
// 若是存在,则使用已经存在的;不然使用spring默认的:SimpleApplicationEventMulticaster
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
}
else {
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
}
}
复制代码
执行其余的初始化操做,例如和
SpringMVC
整合时,须要初始化一些其余的bean
,可是对于纯Spring
工程来讲,onRefresh()
方法是一个空方法。spring
这一步会将自定义的
listener
的bean
名称放入到事件广播器中,同时还会将早期的ApplicationEvent
发布(对于单独的Spring
工程来讲,在此时不会有任何ApplicationEvent
发布,可是和SpringMVC
整合时,SpringMVC
会执行onRefresh()
方法,在这里会发布事件)。方法源码以下:docker
protected void registerListeners() {
// Register statically specified listeners first.
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// 从BeanFactory中找到全部的ApplicationListener,可是不会进行初始化,由于须要在后面bean实例化的过程当中,让全部的BeanPostProcessor去改造它们
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
// 将事件监听器的beanName放入到事件广播器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// 发布早期的事件(纯的spring工程,在此时一个事件都没有)
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
复制代码
该方法十分重要,它完成了全部非懒加载的单例
Bean
的实例化和初始化,属性的填充以及解决了循环依赖等问题。数据库
Spring
建立Bean
的过程当中,是先将Bean
经过反射建立对象,而后经过后置处理器(BeanPostProcessor
)来为对象的属性赋值。因此这里的实例化时指将Bean
建立出来,初始化是指为bean
的属性赋值)。finishBeanFactoryInitialization()
方法的代码以下,bean
的建立和初始化均在beanFactory.preInstantiateSingletons()
中实现。protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// 初始化转换服务
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
// 若是前面没有注册一个相似于PropertyPlaceholderConfigurer后置处理器的bean,那么在这儿会注册一个内置的属性后置处理器
// 这儿主要是处理被加了注解的属性
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
beanFactory.setTempClassLoader(null);
// 将BeanFactory的configurationFrozen属性设置为true,给frozenBeanDefinitionNames属性赋值
// 目的是为了避免让在其余的地方在修改bean的BeanDefinition
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
// 实例化剩下全部的非懒加载的单例
beanFactory.preInstantiateSingletons();
}
复制代码
bean
是不是一个FactoryBean
,以及是否当即实例化FactoryBean
的getObject()
返回的对象,但最终均是调用getBean()
方法去实例化对象。在Bean
实例化、初始化完成后,会判断Bean
是否实现了SmartSingletonInitializing
接口,若是实现了,则会调用该接口的afterSingletonInstantiated()
方法。Tips
:这里提到了FactoryBean
,不是BeanFactory
。这二者名字很像,但做用倒是天差地别,有兴趣的朋友能够先本身Google
查下相关知识。这里先简单介绍一下,后续会单独写一篇文章介绍FactoryBean
,并经过FactoryBean
去解析Spring
与MyBatis
整合的原理。FactoryBean
是一个接口,该接口的实现类会向容器中注册两个bean
,一个是实现类自己所表明类型的对象,一个是经过重写FactoryBean
接口中getObject()
方法所返回的bean
。以下例子中:会向容器中注册两个bean
,一个是MapperFactoryBean
自己,一个是UserMapper
。@Component
public class MapperFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new UserMapper();
}
@Override
public Class<?> getObjectType() {
return UserMapper.class;
}
}
复制代码
bean
的实例化过程太过复杂,后面会结合流程图去分析源码。preInstantiatedSingletons()
方法的执行流程图以下
preInstantiatedSingletons()
代码以下public void preInstantiateSingletons() throws BeansException {
if (logger.isDebugEnabled()) {
logger.debug("Pre-instantiating singletons in " + this);
}
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是不是factoryBean,若是是FactoryBean,则进行FactoryBean原生的实例化(非getObject()方法对应的对象)。
// 还须要判断它是否当即实例化getObject()返回的对象,根据SmartFactoryBean的isEagerInit()的返回值判断是否须要当即实例化
if (isFactoryBean(beanName)) {
// 首先实例化BeanFactory的原生对象,而后再根据isEagerInit()判断是否实例化BeanFactory中getObject()返回的类型的对象
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
final FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
// 若是isEagerInit为true,则当即实例化FactoryBean所返回的类型的对象
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
getBean(beanName);
}
}
}
// 在bean实例化以及属性赋值完成后,若是bean实现了SmartInitializingSingleton接口,则回调该接口的方法
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
复制代码
FactoryBean
仍是普通Bean
,最终都是调用getBean()
方法去建立bean
。getBean()
方法会调用doGetBean()
方法。public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
复制代码
doGetBean()
方法当中,会先从缓存中获取(即从singletonObjects
这个map
集合中获取,为何要先从缓存中获取呢?由于要从Spring
容器获取对象和建立对象,都是经过getBean()
方法,对于单例对象而言,对象只会被建立一次,那么先从缓存中获取对象,若是存在,则不用去新建立了,这样就保证了单例对象只被建立一次)。若是缓存中存在,则接着调用getObjectForBeanInstance()
方法,而后返回bean
。若是缓存中不存在,则继续往下执行。Bean
所对应的BeanDefinition
对象。接着判断bean
有没有依赖,String[] dependsOn = mbd.getDependsOn()
,若是有依赖的对象,那么会先去实例化依赖的对象。getSingleton(beanName,lambda)
方法,这个方法的第二个参数是一个lambda
表达式,真正建立bean
的逻辑是在表达式的方法体中,即createBean()
方法,createBean()
方法会建立完成bean
,而后在getSingleton(beanName,lambda)
方法中会将建立完成的bean
存入到singletonObjects
属性中。createBean()
后面分析。bean
后,最终仍会调用getObjectForBeanInstance()
。这个方法的逻辑比较简单,先判断bean
是不是一个FactoryBean
,若不是,则直接返回bean
;如果,则再判断beanName
是不是以&符号开头,若是是,表示获取的是FactoryBean
的原生对象,则直接返回bean
;若不是以&符号开头,则会返回FactoryBean
的getObject()
方法的返回值对象。doGetBean()
方法代码以下protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
final String beanName = transformedBeanName(name);
Object bean;
// Eagerly check singleton cache for manually registered singletons.
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
// Fail if we're already creating this bean instance:
// We're assumably within a circular reference.
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// Check if bean definition exists in this factory.
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// Not found -> check parent.
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
}
else if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else {
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
}
if (!typeCheckOnly) {
// 标记bean为已建立
// 并清除beanDefinition的缓存(mergedBeanDefinitions)
markBeanAsCreated(beanName);
}
try {
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// 检查bean是不是抽象类
checkMergedBeanDefinition(mbd, beanName, args);
// Guarantee initialization of beans that the current bean depends on.
// 保证当前bean所依赖的bean初始化
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
// isDependent()方法用来判断dep是否依赖beanName
if (isDependent(beanName, dep)) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
}
// 保存下依赖关系
registerDependentBean(dep, beanName);
try {
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
// Create bean instance.
if (mbd.isSingleton()) {
// 此时在getSingleton方法中传入了一个lambda表达式,
// 此时不会当即执行lambda表达式,而是在调用这个lambda表达式的getObject()方法时才开始执行lambda的方法体
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
else if (mbd.isPrototype()) {
// It's a prototype -> create a new instance.
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
else {
String scopeName = mbd.getScope();
final Scope scope = this.scopes.get(scopeName);
if (scope == null) {
throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
}
try {
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
});
bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
catch (IllegalStateException ex) {
throw new BeanCreationException(beanName,
"Scope '" + scopeName + "' is not active for the current thread; consider " +
"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
ex);
}
}
}
catch (BeansException ex) {
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
}
if (requiredType != null && !requiredType.isInstance(bean)) {
try {
T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
if (convertedBean == null) {
throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
}
return convertedBean;
}
catch (TypeMismatchException ex) {
throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
}
}
return (T) bean;
}
复制代码
getObjectForBeanInstance()
方法的做用是为了根据beanName
来判断是返回FactoryBean
原生对象仍是getObject()
方法所返回的对象.若beanName
以&符号开头,则表示返回FactoryBean
原生对象,不然返回getObject()
方法所返回的对象。protected Object getObjectForBeanInstance( Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
if (BeanFactoryUtils.isFactoryDereference(name)) {
if (beanInstance instanceof NullBean) {
return beanInstance;
}
if (!(beanInstance instanceof FactoryBean)) {
throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
}
}
// 若是不是一个FactoryBean对象或者是获取FactoryBean的原生对象(原生对象指的是beanName是以&开头)
// 此时能够直接返回bean
if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
// 若是是获取FactoryBean的getObject()方法返回的类型对象,则须要进入到以下逻辑
// 对于getObject()方法,它返回的对象是在在第一次调用getObject方法时进行实例化的,实例化完成之后,会将结果缓存在factoryBeanObjectCache中
Object object = null;
if (mbd == null) {
object = getCachedObjectForFactoryBean(beanName);
}
if (object == null) {
// Return bean instance from factory.
FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
// Caches object obtained from FactoryBean if it is a singleton.
if (mbd == null && containsBeanDefinition(beanName)) {
mbd = getMergedLocalBeanDefinition(beanName);
}
boolean synthetic = (mbd != null && mbd.isSynthetic());
// 获取FactoryBean返回的对象
object = getObjectFromFactoryBean(factory, beanName, !synthetic);
}
return object;
}
复制代码
doGetBean()
最终会调用createBean()
来建立bean
。createBean()
方法的代码中,主要有两行核心代码:Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
复制代码
resolveBeforeInstantiation()
方法在bean
实例化以前调用,在这个方法中执行了后置处理器InstantiationAwareBeanPostProcessor
的postProcessBeforeInstantiation()
方法,在bean
实例化以前对bean
进行处理。这个扩展点的意义十分重大,Spring
的AOP
就是在这儿实现的,感兴趣的朋友可阅读AnnotationAwareAspectJAutoProxyCreator
这个类的源码,后续会单独写一篇文章进行分析。resolveBeforeInstantiation()
的返回值不为null
,则直接将结果返回。若是为null
,则会继续执行方法doCreateBean()
。在doCreateBean()
方法中,进行了Bean
的实例化、属性赋值、初始化等操做。createBean()
方法的流程图
createBean()
方法的源代码protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
// 第一次调用后置处理器(执行全部InstantiationAwareBeanPostProcessor的子类)
// 若是InstantiationAwareBeanPostProcessor的子类的postProcessBeforeInstantiation()方法返回值不为空,表示bean须要被加强,
// 此时将不会执行后面的逻辑,AOP的实际应用就是在这儿实现的
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
try {
// 第二次执行后置处理器的入口
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
}
复制代码
doCreateBean()
方法会经过反射进行Bean
的建立,而后对bean
进行属性填充(在填充属性的同时,解决了循环依赖的问题),最后会对Bean
回调初始化相关的方法,例如:BeanPostProcessor.postProcessBeforeInilization(),InilizaingBean.afterPropertiesSet()
,给bean
配置的initMethod()
方法,以及BeanPostProcessor.postProcessAfterInilization()
。doCreateBean()
执行的流程图以下: ![doCreateBean()方法流程图]user-gold-cdn.xitu.io/2019/9/11/1…)doCreateBean()
方法的代码(删减了部分代码)以下:protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
// 实例化bean(第二次执行后置处理器的入口),第二次执行后置处理器,主要是为了推断出实例化Bean所须要的构造器
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// 此时bean对象已经建立成功,可是没有设置属性和通过其余后置处理器处理
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 第三次执行后置处理器,缓存bean的注解元数据信息(用于后面在进行属性填充时使用)
// 这一步对于CommonAnnotationBeanPostProcessor、AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor这一类处理器
// 主要是将bean的注解信息解析出来,而后缓存到后置处理器中的injectionMetadataCache属性中
// 而对于ApplicationListenerDetector处理器,而是将bean是不是单例的标识存于singletonNames这个Map类型的属性中
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
mbd.postProcessed = true;
}
}
// 判断一个bean是否放入到singletonFactories中(提早暴露出来,能够解决循环依赖的问题)
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
// 第四次出现后置处理器
// 获取提早暴露的对象,能够解决循环引用的问题,实际上提早暴露出来的bean是放入到了singletonFactories中,key是beanName,value是一个lambda表达式
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 填充属性,第五次、第六次后置处理器入口
populateBean(beanName, mbd, instanceWrapper);
// 第七次、第八次执行后置处理器入口
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
}
return exposedObject;
}
复制代码
createBeanInstance()
会经过反射建立对象时,会先执行后置处理器,经过调用后置处理器的deternineCondidateConstructors()
方法来推断出使用哪个构造器来建立Bean
,典型的表明类有AutowiredAnnotationBeanPostProcessor
。bean
被经过反射建立完成后,会再次调用后置处理器MergedBeanDefinitionPostProcessor.postProcessMargedBeanDefinition()
方法,这一步执行后置处理器的目的是为了找出加了@Autowired
、@Resource
等注解的属性和方法,而后将这些注解信息缓存到injectionMetadataCache
属性中,便于后面在bean
初始化阶段(属性赋值阶段),根据@Autowired
等注解实现自动装配。这一步的表明后置处理器有AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
是用来处理Spring
提供的注解和JSR-330
中的部分注解,如:@Autowired
,@Value
,@Inject
。CommonAnnotationBeanPostProcessor
是用来处理JSR-250
中的注解,如@Resource
、@PostConstruct
、@PreDestroy
。编程
bean
(由于此时还未给bean
的属性赋值,未完成自动装配,所以称之为半成品)放入到DefaultSingletonBeanRegistry
类的singletonFactories
的属性中,singletonFactories
属性是一个Map
,key
为beanName
,值为ObjectFactory
类型(实际上就是一个lambda
表达式),当调用ObjectFactory
的getObject()
方法时,会执行lambda
表达式的方法体,在当前场景下,lambda
表达式的代码以下,实际上就是执行了一次Bean
的后置处理器。这一步的目的是为了解决bean
之间的循环依赖,到底是如何解决循环依赖的,之后分析。protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
// 调用后置处理的方法获取bean早期暴露出来的bean对象(半成品)
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
复制代码
populateBean()
方法,在该方法中又会执行两次Bean
后置处理器,第一次执行后置处理器是为了判断Bean
是否须要继续填充属性,若是InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
方法返回的false
,则表示不进行属性填充,bean
就不会进行@Autowired
等自动装配过程,populateBean()
方法会直接结束。若返回true
,则会进行接下来的属性填充,即会执行第二次后置处理器,InstantiationAwareBeanPostProcessor.postProcessPropertyValue()
方法,这一步的主角就是AutowiredAnnotationBeanPostProcessor
和CommonAnnotationBeanPostBeanPostProcessor
了,它们会根据前面缓存在injectionMetadataCache
中的注解信息来进行自动装配。populateBean()
方法后后,接下来回执行initializeBean()
方法,即进入初始化阶段。在initializeBean()
方法中,最早执行invokeAwareMethods()
方法,即执行Aware
接口的方法,如:BeanNameAware
、BeanClassLoaderAware
、BeanFactoryAware
。而后再一次执行全部Bean
后置处理器的BeanPostProcessor.postProcessBeforeInitialization()
方法。接着执行invokeInitMethods()
方法,在invokeInitMethods()
方法中,会执行InitializingBean
的afterPropertiesSet()
方法,和定义bean
时自定义的initMethod()
方法。最后再一次执行bean
后置处理器,BeanPostProcessor.postProcessAfterInitialization()
。bean
的实例化、初始化过程已经完成,建立好的bean
会被返回,如果单例bean
,最后会被存放到DefaultSingletonBeanRegistry
的singletonObjects
中。Spring
容器的启动基本结束了,此时Bean
已经被实例化完成,且完成了自动装配。执行finishRefresh()
方法,是为了在容器refresh()
结束时,作一些其余的操做,例如:发布ContextRefreshedEvent
事件,这样当咱们想在容器refresh
完成后执行一些特殊的逻辑,就能够经过监听ContextRefreshedEvent
事件来实现。Spring
内置了四个和应用上下文(ApplicationContextEvent
)有关的事件:ContextRefreshedEvent
、ContextStartedEvent
、ContextStopedEvent
、ContextClosedEvent
。protected void finishRefresh() {
clearResourceCaches();
initLifecycleProcessor();
getLifecycleProcessor().onRefresh();
// 发布ContextRefreshedEvent
publishEvent(new ContextRefreshedEvent(this));
LiveBeansView.registerApplicationContext(this˛);
}
复制代码
最后在
refresh()
方法的finally
语句块中,执行了resetCommonCaches()
方法。由于在前面建立bean
时,对单例bean
的元数据信息进行了缓存,而单例bean
在容器启动后,不会再进行建立了,所以这些缓存的信息已经没有任何用处了,在这里进行清空,释放部份内存。数组
protected void resetCommonCaches() {
ReflectionUtils.clearCache();
AnnotationUtils.clearCache();
ResolvableType.clearCache();
CachedIntrospectionResults.clearClassLoader(getClassLoader());
}
复制代码
Spring
的源码分析中,能够看出,启动过程当中,bean
的建立过程最为复杂,在建立过程当中,先后一共出现了8次调用BeanPostPorcessor
(实际上在bean
的整个生命周期中,一共会出现9
次调用后置处理器,第九次出如今bean
的销毁阶段。)Spring
的源码,单例bean
的生命周期能够总结为以下一张图
Spring
的启动流程,经过AnnotationConfigApplicationContext
的有参构造方法入手,重点分析了this()
方法和refresh()
方法。在this()
中初始化了一个BeanFactory
,即DefaultListableBeanFactory
;而后向容器中添加了7个内置的bean
,其中就包括ConfigurationClassPostProcessor
。refresh()
方法中,又重点分析了invokeBeanFactoryPostProcessor()
方法和finishBeanFactoryInitialization()
方法。invokeBeanFactoryPostProcessor()
方法中,经过ConfigurationClassPostProcessor
类扫描出了全部交给Spring
管理的类,并将class
文件解析成对应的BeanDefinition
。finishBeanFactoryInitialization()
方法中,完成了非懒加载的单例Bean
的实例化和初始化操做,主要流程为getBean()
——>doGetBean()
——>createBean()
——>doCreateBean()
。在bean
的建立过程当中,一共出现了8
次BeanPostProcessor
的执行,在这些后置处理器的执行过程当中,完成了AOP
的实现、bean
的自动装配、属性赋值等操做。Spring
中单例Bean
的生命周期。本文主要介绍了
Spring
的启动流程,但对于一些地方的具体实现细节没有展开分析,所以后续Spring源码分析的计划以下:缓存
ConfigurationClassPostProcessor
类如何扫描包,解析配置类。@Import
注解做用与@Enable
系列注解的实现原理JDK
动态代理与CGLIB
代理FactoryBean
的用途和源码分析AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
如何实现自动装配,Spring
如何解决循环依赖AOP
的实现原理SpringBoot
源码分析Pepper-Metrics
地址: github.com/zrbcool/pep… GitHub
Pepper-Metrics
是坐我对面的两位同事一块儿开发的开源组件,主要功能是经过比较轻量的方式与经常使用开源组件(jedis/mybatis/motan/dubbo/servlet
)集成,收集并计算metrics
,并支持输出到日志及转换成多种时序数据库兼容数据格式,配套的grafana dashboard
友好的进行展现。项目当中原理文档齐全,且所有基于SPI
设计的可扩展式架构,方便的开发新插件。另有一个基于docker-compose
的独立demo
项目能够快速启动一套demo
示例查看效果https://github.com/zrbcool/pepper-metrics-demo
。若是你们以为有用的话,麻烦给个star
,也欢迎你们参与开发,谢谢:)微信
欢迎扫描下方二维码,关注微信公众号:菜鸟飞呀飞 阅读更多源码,再也不面向搜索引擎编程