springboot源码解析

springboot源码解析

springboot 约定大于配置,一种软件设计范式

配置文件加载顺序

  1. application*.yml
  2. application*.yaml
  3. 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对象

  1. 判断web类型
    1. none
    2. servlet
    3. webflux:reactive
  2. 设置初始化器,加载一些初始类的实例化
  3. 设置监听器,加载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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值