文章目录
一、SpringBoot入门
1. SpringBoot特点
1.1 依赖管理
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<!--它的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.3</version>
</parent>
<!--spring-boot-dependencies中几乎声明了开发种常用的所有jar的版本-->
- 开发中导入starter场景启动器
SpringBoot开发中常用starter - 无需关注版本号,SpringBoot自动版本仲裁
1.2 自动配置
- 自动配好Tomcat
- 引入了Tomcat依赖
- 配置Tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.5.3</version> <scope>compile</scope> </dependency>
- 自动配置SpringMVC
- 引入SpringMVC全套组件
- 自动配置SpringMVC常用组件
- 自动配置Web常用功能,例如:字符编码问题
- SpringBoot帮我们配置好了所有常见的Web开发场景
- 默认包结构扫描
- 主程序所有包及其下面的所有子包里面的组件都会被默认扫描进来
- 无需之前的包扫描配置
- 想要改变包扫描路径,可以使用@SpringBootApplication(scanBasePackages = “.”)或者@ComponentScan 指定包的扫描路径
- 各种配置拥有默认值
- 默认配置最终都是映射都某一个类上
- 配置文件的值最终会绑定到某个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项
- 当开发中引入了某个场景这个场景的配置才会生效
- SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包中
二、底层注解
1. 组件添加
1.1 @Configuration
@Configuration和@Bean注解实现组件的添加
- 基本使用
//告诉SpringBoot这是一个配置类,等同于我们的配置文件 //参数proxyBeanMethods:代理bean的方法,默认为true @Configuration public class MyConfig { //向容器中添加组件,以方法名作为组件id,返回类型就是类型,返回的对象就是容器中的实例 @Bean public User user01(){ return new User("Job",18); } }
- Full模式和Lite模式
- 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
- 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
- 参数proxyBeanMethods=true为Full模式
1.2 @Import
- 给容器中自动创建出相关类型的组件
- 默认组件的名字为全类名
@Import({User.class, Animal.class}) public class MyConfig { }
1.3 @Cinditional
当条件满足时,则进行组件注入
@Configuration()
@ConditionalOnBean(name = "tom")//当容器中有tom这个组件时,里面的方法才执行
public class MyConfig {
@Bean
public User user01() {
return new User("Job", 18);
}
@Bean("tom")
public User user02() {
return new User("Tom", 20);
}
}
1.4 其他注解
- @Bean,@Component,@Controller,@Service,@Repository,@ComponentScan
- 这些都是Spring常见的注解,不过多解释
2. 原生配置文件引入
2.1 @ImportResource
- @ImportResource(“classpath:beans.xml”)
- 导入Spring的配置文件
3. 配置绑定
3.1 @ConfigurationProperties
- 编写配置文件
animal.name="dog"
- 代码演示
@Data @Component @ConfigurationProperties(prefix = "animal") public class Animal { String name; }
- 测试
@RunWith(SpringRunner.class) @SpringBootTest public class TestDemo { @Autowired Animal animal; @Test public void test(){ String name = animal.getName(); System.out.println("animal.getName()="+name);//animal.getName()="dog" } }
3.2 @EnableConfigurationProperties
@EnableConfigurationProperties(Animal.class)
- 开启Animal配置绑定功能
- 把Animal这个组件自动注册到容器中
- 代码演示
//在配置类上添加该注解 @EnableConfigurationProperties(Animal.class) public class MyConfig { } @Data //不需要使用注解将Animal注入到容器 //@Component @ConfigurationProperties(prefix = "animal") public class Animal { String name; }
- 测试
@RunWith(SpringRunner.class) @SpringBootTest public class TestDemo { @Autowired Animal animal; @Test public void test(){ String name = animal.getName(); System.out.println("animal.getName()="+name);//animal.getName()="dog" } }
三、自动配置原理
1. 引导加载自动配置类
//SpringBootApplication注解底层
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
......
}
- @SpringBootConfiguration
- 该注解的底层是@Configuration,则说明入口main程序是SpringBoot的一个配置类
- @ComponentScan
- 该注解指定扫描哪些包
- @EnableAutoConfiguration
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
- @AutoConfigurationPackage注解的底层是@Import({Registrar.class})
- Registrar类帮我们批量导入组件,导入我们指定的一个包下的所有组件,即主程序类所在的包下
- @Import({AutoConfigurationImportSelector.class})
- 底层使用this.getAutoConfigurationEntry(annotationMetadata)方法为我们导入组件
- 调用List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所需导入的所有配置类
- 利用工厂Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {…}得到所有的组件
- 在"META-INF/spring.factories"位置加载一个文件,默认扫描系统里所有"META-INF/spring.factories"位置的文件
- spring-boot-autoconfigure-2.5.3.jar包中有"META-INF/spring.factories",该路径下有SpringBoot启动需要加载的所有配置文件
2. 按需开启自动配置项
-
引导加载自动配置类时会加载所需的所有配置
-
按照条件匹配规则(@Conditional),最终会按需配置
- 当导入了aop相关的包时,该配置才会生效
3. 总结
- SpringBoot先加载所有的自动配置类xxxAutoApplication
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。从xxxProperties中获取值,xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中存在这些组件,则说明该功能就会生效
- 定制化配置
- 用户直接使用@Bean替换底层的组件
- 用户通过修改配置文件来定制配置
- xxxAutoConfiguration —>组件 —>从xxxProperties里面获取值 —>application.properties