SpringBoot基础,特点、底层注解、自动配置原理

一、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的版本-->

1.2 自动配置

  1. 自动配好Tomcat
    • 引入了Tomcat依赖
    • 配置Tomcat
      <dependency>
    	  <groupId>org.springframework.boot</groupId>
    	  <artifactId>spring-boot-starter-tomcat</artifactId>
    	  <version>2.5.3</version>
    	  <scope>compile</scope>
      </dependency>
    
  2. 自动配置SpringMVC
    • 引入SpringMVC全套组件
    • 自动配置SpringMVC常用组件
  3. 自动配置Web常用功能,例如:字符编码问题
    • SpringBoot帮我们配置好了所有常见的Web开发场景
  4. 默认包结构扫描
    • 主程序所有包及其下面的所有子包里面的组件都会被默认扫描进来
    • 无需之前的包扫描配置
    • 想要改变包扫描路径,可以使用@SpringBootApplication(scanBasePackages = “.”)或者@ComponentScan 指定包的扫描路径
  5. 各种配置拥有默认值
    • 默认配置最终都是映射都某一个类上
    • 配置文件的值最终会绑定到某个类上,这个类会在容器中创建对象
  6. 按需加载所有自动配置项
    • 当开发中引入了某个场景这个场景的配置才会生效
    • SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包中

二、底层注解

1. 组件添加

1.1 @Configuration

@Configuration和@Bean注解实现组件的添加

  1. 基本使用
    //告诉SpringBoot这是一个配置类,等同于我们的配置文件
    //参数proxyBeanMethods:代理bean的方法,默认为true
    @Configuration
    public class MyConfig {
    
    	//向容器中添加组件,以方法名作为组件id,返回类型就是类型,返回的对象就是容器中的实例
    	@Bean
    	public User user01(){
    		return new User("Job",18);
    	}
    }
    
  2. Full模式和Lite模式
    • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
    • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
    • 参数proxyBeanMethods=true为Full模式

1.2 @Import

  1. 给容器中自动创建出相关类型的组件
  2. 默认组件的名字为全类名
    @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

  1. 编写配置文件
    animal.name="dog"
    
  2. 代码演示
    @Data
    @Component
    @ConfigurationProperties(prefix = "animal")
    public class Animal {
    	String name;
    }
    
  3. 测试
    @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这个组件自动注册到容器中
  1. 代码演示
    //在配置类上添加该注解
    @EnableConfigurationProperties(Animal.class)
    public class MyConfig { }
    
    @Data
    //不需要使用注解将Animal注入到容器
    //@Component
    @ConfigurationProperties(prefix = "animal")
    public class Animal {
    	String name;
    }
    
  2. 测试
    @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 {
	......
}
  1. @SpringBootConfiguration
    • 该注解的底层是@Configuration,则说明入口main程序是SpringBoot的一个配置类
  2. @ComponentScan
    • 该注解指定扫描哪些包
  3. @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. 按需开启自动配置项

  1. 引导加载自动配置类时会加载所需的所有配置

  2. 按照条件匹配规则(@Conditional),最终会按需配置
    在这里插入图片描述

    • 当导入了aop相关的包时,该配置才会生效

3. 总结

  1. SpringBoot先加载所有的自动配置类xxxAutoApplication
  2. 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。从xxxProperties中获取值,xxxProperties和配置文件进行了绑定
  3. 生效的配置类就会给容器中装配很多组件
  4. 只要容器中存在这些组件,则说明该功能就会生效
  5. 定制化配置
    • 用户直接使用@Bean替换底层的组件
    • 用户通过修改配置文件来定制配置
  6. xxxAutoConfiguration —>组件 —>从xxxProperties里面获取值 —>application.properties

四、参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ysw!不将就

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值