SpringBoot2笔记-1.3 自动配置原理
第1节 Spring Boot特点
- 依赖管理
- 自动配置
特点1 依赖管理
- 父项目做依赖管理
- 开发导入starter场景启动器
- 无需关注版本号,自动版本仲裁
父项目做依赖管理
父项目中声明了开发中所有常用的依赖的版本号,不用担心版本对应的问题。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
starter场景启动器
starter
申明了常见开发环境中的依赖项目,如果想通过spring jpa访问数据库,可以通过spring-boot-starter-data-jpa
一站式导入所有需要的依赖包。
文档/using-spring-boot.html#using-boot-starter 中列举常见的starter以其应用场景。
自动版本仲裁
1、引入依赖默认都可以不写版本
2、引入非版本仲裁的jar,要写版本号
修改默认版本号
可以在当前pom文件中,添加properties
标签内容执行自定义版本号。
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
特点2 自动配置
以spring-boot-starter-web
举例,SpringBoot自动完成以下自动配置选项。
- 内置Tomcat
- 引入Tomcat依赖
- 自动配置tomcat,如Servlet之类的。
- 自动配置SpringMVC
- 自动导入相关的包
- 配置了常见的springMVC组件,例如字符编码过滤器、文件上传解析器。
- TODO:添加SpringMVC的笔记链接
第2节 容器功能
Spring提供了帮助管理JavaBean的容器功能,但是Spring Boot进一步了优化了使用步骤。
第一种组件添加,通过在类上添加注解,可以直接将该类申明为由spring管理的bean。
常见的注解由
- @Configuration
- @Bean、@Component、@Controller、@Service、@Repository
- @ComponentScan、@Import
第二种原生配置文件引入,在配置类上添加@ImportResource
注解,可以直接导入xml文件配置的bean,适合对以往的项目做整合。
对导入的组件,可将其属性和属性文件中的值绑定。
方式1 组件添加
@Configuration
通过
@Configration
将一个类声明为配置类,通过方法体配置Bean,同时自身也为一个Bean由Spring管理。
通过其中的Proxybeanmethods属性控制是否按
单例模式
返回Bean:
赋值True时,为Full模式,返回单例Bean对象。
赋值False时,为Lite模式,每次调用方法将返回一个新的Bean对象。
通过
@Bean
配置类中的一个方法申明为Bean,Bean对象类型为返回值类型,Bean名称默认为方法名,也可通过往注解中传入字符串指定。
@Bean、@Component、@Controller、@Service、@Repository
这些注解更为常见,将当前类申明为由Spring管理的Bean。
@ComponentScan、@Import
这两个配置导入指定的对象为Spring管理的组件,用于配置类中。
- @ComponentScan扫描指定包中的所有类。
- @Import导入特定的类。
@Conditional
对申明由Spring管理的bean,申明注入组件的条件。
方式2 原生配置文件引入
在配置类名上添加@ImportResource
注解,导入配置好的xml文件。
@ImportResource("classpath:beans.xml")
public class MyConfig {}
配置绑定
SpringBoot将所有的属性都放在application文件中,文件后缀为yml或者properties。
初始化Bean组件时,可以通过属性文件指定对象的属性。
在组件类的类名上添加@ConfigurationProperties(prefix = "mycar")
注解,可以自动读取属性文件中前缀下的属性和类的属性对应,将值用于对象初始化。(可用于一些常见配置,如果datasource、服务端口)
该类需要添加组件注解被Spring发现并管理。SB提供了@EnableConfigurationProperties
类注解辅助导入,实际作用和@Import
差不多。
第3节 自动配置原理入门
@SpringBootConfigration等价于三个
- @SpringBootConfiguration,表示配置类
- @ComponentScan,指定了组件的扫描包
- @EnableAutoConfiguration,开启了自动配置。
@EnableAutoConfiguration
包含两个注解。
@AutoConfigurationPackage
封装导入了AutoConfigurationPackages.Registrar.class
,通过这个类导入了一系列组件。
@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)
获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);
得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
自动配置的项目会由
@Conditionnal
按需开启。
在自己定义的配置类中可以修改默认配置的Bean。
第四节 开发小技巧
Lombok
- 简化JavaBean开发
@NoArgsConstructor
//@AllArgsConstructor
@Data
@ToString
@EqualsAndHashCode
- 简化日志开发
@Slf4j #自动注入log对象以供打印。
dev-tools
修改项目文件后(不包括模板文件),自动重启项目
Spring Initailizr
自助式选择依赖项目,自动创建目录结构,自动写好启动类。