springboot源码解析
springboot 约定大于配置,一种软件设计范式
配置文件加载顺序
- application*.yml
- application*.yaml
- application*.properties
@SpringBootApplication
springboot组合注解包括主要下面三个
-
@SpringBootConfiguration // java配置类
-
@EnableAutoConfiguration // 自动配置
-
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
@EnableAutoConfiguration
自动装配注解主要包括下面两个注解
- @AutoConfigurationPackage // 自动扫描包
- @Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage
将注解元信息传入,获取到相应的包名
Registrar
register
把项目启动类所在包名构建成BasePackages,并注入ioc容器
AutoConfigurationImportSelector.class
// 先加载好这四个类
private ConfigurableListableBeanFactory beanFactory;
private Environment environment;
private ClassLoader beanClassLoader;
private ResourceLoader resourceLoader;
//执行selectImports
获取自动配置的元信息,传入beanClasssLoader
判断classLoader是否为空,不为空加载spring-autoconfigure-metadata.properties文件
根据文件配置满足的过滤条件的bean加载容器中
会走process
getAutoConfigurationEntry
getAttributes(annotationMetadata) // 将注解元信息封装成注解属性对象
getCandidateConfigurations // 获取到配置类的全路径字符串集合
loadFactoryNames // 加载组件名称
loadSprngFactories // 加载spring.factories文件,声明了当前在启动过程哪些工厂类可以实例到ioc容器中
删除重复项,完成一些过滤
removeDuplicates
filter(configurations,autoConfigurationMetadata);
// 广播事件AutoConfigurationImportEvent
fireAutoConfigurationImportEvents(configurations,exclusions)
SpringApplication.run(AppApplication.class, args)
实例化springApplication对象
- 判断web类型
- none
- servlet
- webflux:reactive
- 设置初始化器,加载一些初始类的实例化
- 设置监听器,加载ApplicationListener对应的监听器初始化main方法启动
启动run方法
StopWatch监听启动时间
1、获取启动监听器
2、运行环境预配置,profiles多环境配置
打印banner
3、创建应用上下文spring容器
4、spring容器前置处理,容器刷新前准备动作,为自动化配置做好基础
5、刷新容器,通过refresh方法对整个ioc容器初始化(bean的定位、解析、注册)refreshContext(context)
6、spring容器后置处理,钩子方法用于扩展
StopWatch结束时长统计
7、通过监听器发出结束执行的事件通知
8、执行runners,ApplicationRunner和CommandLineRunner
9、发布应用上下文就绪事件,运行SpringApplicationRunListener
springboot内嵌tomcat
spring-boot-starter-web
spring-boot-starter-tomcat
run方法执行时在spring.factories中有ServletWebServerFactoryAutoConfiguration工厂类,类里面引入了EmbeddedTomcat等容器,TomcatServletWebServerFactory生产tomcat对象,initialize->this.tomcat.start();
refreshContext 创建内嵌tomcat并启动
onRefresh()通过ServletWebServerApplicationContext子类调用
- createWebServer
- getWebServerFactory() // 获取工厂
- getWebServer // 创建omcat并启动
springboot相关整合
springboot整合mybatis,redis,thymeleaf,
整合mybatis
注解方式
接口mapper上添加@Mapper或直接在启动类上添加@MapperScan
为什么不用@Repository,因为mapper都是接口不是类,@Mapper生成接口的代理类
@MapperScan 和@Mapper在不同包中,@Mapper注解失效
配置文件方式
yml配置
mybatis:
#配置mybatis的xml配置文件路径
** mapper-locations**: classpath:mapper/*.xml
#配置xml映射文件中指定的实体类别名路径
** type-aliases-package**: com.zcl.pojo
整合jpa
@Entity、@Id、@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
Repository接口:CommentRepository extends JpaRepository<Comment, Integer>
整合redis
默认缓存
@EnableCaching
@RedisHash(“person”)
@Id、@Indexed二级索引
@CachePut 将数据库修改的数据重新放入缓存
@CacheEvict 先删除数据库数据,然后再删除缓存数据
/**
* 序列化的4种方式(默认使用JDK的序列化方式):https://blog.csdn.net/u013282737/article/details/89682378
* 1:JdkSerializationRedisSerializer:
* 2:GenericJackson2JsonRedisSerializer
* 3:StringRedisSerializer
* 4:GenericFastJsonRedisSerializer
*/
整合thymeleaf
![image.png](https://img-blog.csdnimg.cn/img_convert/8bc67a9429b7e7c0f1a69aecedffaedb.png#align=left&display=inline&height=444&margin=[object Object]&name=image.png&originHeight=444&originWidth=507&size=174805&status=done&style=none&width=507) ## 整合国际化i18n spring.messages.basename=i18n.login
[[#{login.rememberme}]] 行内表达式
中文
LocaleResolver、Local、Accept-Language