引文
很多人都想看spring源码,但是spring模块太多了,翻开一开头皮发麻,然后就放弃了,这里我带领大家一起看spring源码,推荐从ioc看起,spring ioc源码怎么看?我们一定要先找到一个头,最简单的办法就搞个demo,一层一层点进去看。
spring 模块
spring-aop
spring-aspects
spring-beans
spring-context
spring-context-indexer
spring-context-support
spring-core
spring-expression
spring-instrument
spring-jcl
spring-jdbc
spring-jms
spring-messaging
spring-orm
spring-oxm
spring-test
spring-tx
spring-web
spring-webflux
spring-webmvc
spring-websocket
先从最基本的spring ioc开始,我们先建一个简单demo
接口
public interface UserService {
/** 方法 */
void show();
}
实现
public class UserServiceImpl implements UserService {
@Override
public void show() {
System.out.println("UserServiceImpl - show");
}
}
Spring配置
路径:resources/application.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">
<bean id="userService" class="com.user.impl.UserServiceImpl"/>
</beans>
测试类
public class TestMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
UserService userService = context.getBean(UserService.class);
userService.show();
}
}
这里使用ClassPathXmlApplicationContext来启动ioc容器,我们比较关心它主要做了什么事。ClassPathXmlApplicationContext在初始化时,先初始父类,然后调用父类refresh()方法,refresh()中有一系列操作
正常
1、prepareRefresh(); 准备工作
2、obtainFreshBeanFactory(); 解析配置文件组装bean定义
3、prepareBeanFactory(beanFactory); 设置BeanFactory的类加载器
4、postProcessBeanFactory(beanFactory); 埋点初始化,可以在初始化前做一些操作
5、invokeBeanFactoryPostProcessors(beanFactory); 调用BeanFactoryPostProcessor
6、registerBeanPostProcessors(beanFactory); 注册BeanPostProcessor 的实现类
7、initMessageSource(); 国际化
8、initApplicationEventMulticaster(); 初始化ApplicationContext 的事件广播器
9、onRefresh(); 具体的子类可以在这里初始化一些特殊的 Bean
10、registerListeners(); 注册事件监听器
11、finishBeanFactoryInitialization(beanFactory); 初始化所有的beans(lazy-init 的除外)
12、finishRefresh(); 广播事件,ApplicationContext初始化完成
异常
1、destroyBeans(); 销毁已经初始化的Beans
2、cancelRefresh(ex); 设置活动标志false
最后
resetCommonCaches(); 清理缓存
后面章节我们详细讲解所有类和方法