赞
踩
Spring Boot源码剖析
一.Spring Boot 项目的启动入口流程分析
Spring Boot项目的启动入口main线程上有一个@SpringBootApplication( @Configuration + @EnableAutoConfiguration + @ComponentScan )注解, 表明是主配置类, 让程序自动识别并进行必要的配置
项目启动后, 首先进行自动配置, 源码如下:
---在org.springframework.boot.autoconfigure 包下有一个接口实现类: AutoConfigurationImportSelector
public classAutoConfigurationImportSelectorimplements... {
...try{
AutoConfigurationMetadata autoConfigurationMetadata=AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes=getAttributes(annotationMetadata);
List configurations =getCandidateConfigurations(annotationMetadata,
attributes);
...}catch(IOException ex) {throw newIllegalStateException(ex);
}
}
}
通过SpringFactoriesLoader扫描默认的资源路径( 源码如下 ), 返回 List configurations (我的项目中, 97个配置项), 在经过一系列方法处理后, 留下必要的配置( 23个 ), 随后经历一个重要的 Spring框架的类的方法, 逐步部署项目, 即 AbstractApplicationContext 类的 refresh()方法.
public abstract classSpringFactoriesLoader {
...public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
...
}
ps: 不妨在自己的SpringBoot项目中找到这个类, 在红色代码( 创建候选配置集合 )处添加断点, debug启动来跟进SpringBoot的加载过程.
二.Spring Boot 启动时如何加载各种框架配置类? 举例: Mybatis
1. springboot启动时, 通过扫描到的注解 @EnableConfigurationProperties(MybatisProperties.class) 加载了mybatis框架配置类: MybatisAutoConfiguration
2. 查看mybatis框架的配置类
public classMybatisAutoConfiguration {private finalMybatisProperties properties;
...
@Bean
@ConditionalOnMissingBeanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throwsException {
SqlSessionFactoryBean factory= newSqlSessionFactoryBean();
...
}
3. 查看mybatis的详细配置信息
@ConfigurationProperties(prefix =MybatisProperties.MYBATIS_PREFIX)public classMybatisProperties {public static final String MYBATIS_PREFIX = "mybatis";
...
}
4. 查看mybatis-spring-boot-autoconfigure.jar 包下的 META-INF 资源路径
三.自研mybatis-demo框架与Spring Boot整合
1. 分析: 自研框架的jar包, 需要哪些核心类?
类比Mybatis, 需要的核心类, 有 SqlSessionFactory,
MybatisAutoConfiguration,
SqlSessionFactory method..(),
MybatisProperties.
2.创建项目 demo-mybatis, 项目结构如下, 进行maven install 打成 jar包, 模拟框架的发布
项目源码地址见本篇博文尾部, 欢迎指正!
3. 新建SpringBoot项目, 添加SpringMvc依赖, 即 boot-web-starter
① 引入我们打好的demo-mybatis 自研框架的 jar 包
依赖如下:
com.demo
demo-mybatis
0.0.1-SNAPSHOT
② 编辑Controller
@RestControllerpublic classDemoController {
@Autowired
SqlSessionFactory sessionFactory;
@RequestMapping("/demo-mybatis")publicString demo() {returnsessionFactory.getSqlSession();
}
}
③ 修改yml文件自定义 框架的配置属性
com:
demo:
mybatis:
hello: hi!
world: new world!
④ 启动项目, 会看到控制台输出了自研框架内的"假"信息:
访问成功!!!
就这样, 我们剖析了SpringBoot的加载原理, 并仿造Mybatis框架, 自研了一个demo框架, 并整合到SpringBoot项目中!!!
欢迎交流指正~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。