SpringBoot2基础(自动配置原理,配置文件)

入门

文档

https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

依赖管理

SpringBoot2基础(自动配置原理,配置文件)_第1张图片
SpringBoot2基础(自动配置原理,配置文件)_第2张图片
crtl点进去再点进去就可以看到springboot常用的依赖的版本号,自动版本仲裁机制

SpringBoot2基础(自动配置原理,配置文件)_第3张图片
所以只要导入依赖就可以了

可以在spring-boot-dependencies查看有没有再导入
SpringBoot2基础(自动配置原理,配置文件)_第4张图片
SpringBoot2基础(自动配置原理,配置文件)_第5张图片

可以修改默认版本号
SpringBoot2基础(自动配置原理,配置文件)_第6张图片

部署

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

把项目打成jar包,直接在目标服务器执行即可。

用maven的build

了解自动配置原理

开发导入starter场景启动器

SpringBoot2基础(自动配置原理,配置文件)_第7张图片

见到很多 spring-boot-starter-* : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
4、见到的  *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
5、所有场景启动器最底层的依赖
<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starterartifactId>
  <version>2.3.4.RELEASEversion>
  <scope>compilescope>
dependency>

自动配置

• 默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
• 无需以前的包扫描配置
想要改变扫描路径@SpringBootApplication(scanBasePackages="com.atguigu")
• 或者@ComponentScan 指定扫描路径

@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.example.demo")
public class DemoApplication {


    public static void main(String[] args) {
        //1、返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);

        //2、查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
}
}

查看主件,已经自动配置好了相关设置
如:配置好了web的一切,像过滤器什么的

容器功能

组件添加

1、@Configuration

基本使用@Configuration(proxyBeanMethods =xxx)
Full模式:Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
Lite模式:Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

最佳实战
  • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
  • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

2、@Bean、@Component、@Controller、@Service、@Repository

3、@ComponentScan、@Import

 * 4@Import({User.class, DBHelper.class})
 *      给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

https://blog.csdn.net/weixin_46168350/article/details/115531860

4、@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入
有很多子注解了
SpringBoot2基础(自动配置原理,配置文件)_第8张图片

@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")

原生配置文件引入

@ImportResource

@ImportResource("classpath:beans.xml")
可以导入beans的文件

配置绑定

application.properties

mycar.brand=YD
mycar.price=100000

1、@ConfigurationProperties

/**
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能所以需要@Component
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
   private String brand;
    private Integer price;
    }

自动导入application.properties
prefix = "mycar"中prefix 是前缀

2、@EnableConfigurationProperties + @ConfigurationProperties

如果没有加@Component可以用这个适合于第三方包

@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中

自动配置原理入门

引导加载自动配置类

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
@SpringBootConfiguration//@Configuration。代表当前是一个配置类
@ComponentScan//指定扫描哪些,Spring注解;
@EnableAutoConfiguration//开启自动配置功能
@AutoConfigurationPackage //自动配置包

@EnableAutoConfiguration

源码:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
  • 1、@AutoConfigurationPackage
    自动配置包?指定了默认的包规则
@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
public @interface AutoConfigurationPackage {}

//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?   MainApplication 所在包下。
  • 2、@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List>> 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

文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
SpringBoot2基础(自动配置原理,配置文件)_第9张图片

关闭某个特定的自动配置

@SpringBootApplication(exclude={Neo4jDataAutoConfiguration.class})

按需开启自动配置项

文件会加载所有的配置类但是不会开启
如:
SpringBoot2基础(自动配置原理,配置文件)_第10张图片
项目报红了,而且有@ConditionalOnClass
意思是有Advice类时才会开启下面的类

虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。

这些springmvc的是自动配置好了的
SpringBoot2基础(自动配置原理,配置文件)_第11张图片

修改默认配置

SpringBoot2基础(自动配置原理,配置文件)_第12张图片
SpringBoot2基础(自动配置原理,配置文件)_第13张图片

总结

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。
      xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

最佳实践

  • 查看自动配置了哪些(选做)
    • 自己分析,引入场景对应的自动配置一般都生效了
    • 配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)
  • 是否需要修改
    • 参照文档修改配置项:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties
    • 自己分析。xxxxProperties绑定了配置文件的哪些。
  • 自定义加入或者替换组件
    • @Bean、@Component。。。
  • 自定义器 XXXXXCustomizer;
    • …

配置文件

yaml

简介

YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件

基本语法

  • key: value;kv之间有空格
  • 大小写敏感
    使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释
  • 字符串无需加引号,如果要加,''""表示字符串内容 会被 转义/不转义

数据类型

  • 字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
  • 对象:键值对的集合。map、hash、set、object
行内写法:  k: {k1:v1,k2:v2,k3:v3}
#或
k: 
	k1: v1
  k2: v2
  k3: v3
  • 数组:一组按次序排列的值。array、list、queue,set
    - 值表示数组中的一个元素,比如:
行内写法:  k: [v1,v2,v3]
#或者
k:
 - v1
 - v2
 - v3

案例

@ConfigurationProperties(prefix = "person")
@Component
@ToString
@Data
public class Person {
	
	private String userName;
	private Boolean boss;
	private Date birth;
	private Integer age;
	private Pet pet;
	private String[] interests;
	private List<String> animal;
	private Map<String, Object> score;
	private Set<Double> salarys;
	private Map<String, List<Pet>> allPets;
}

@Data
public class Pet {
	private String name;
	private Double weight;
}
# yaml表示以上对象
person:
  userName: zhangsan
  boss: false
  birth: 2019/12/12 20:12:33
  age: 18
  pet: 
    name: tomcat
    weight: 23.4
  interests: [篮球,游泳]
  animal: 
    - jerry
    - mario
  score:
    english: 
      first: 30
      second: 40
      third: 50
    math: [131,140,148]
    chinese: {first: 128,second: 136}
  salarys: [3999,4999.98,5999.99]
  allPets:
    sick:
      - {name: tom}
      - {name: jerry,weight: 47}
    health: [{name: mario,weight: 47}]

配置提示

       <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
            <optional>trueoptional>
        dependency>


 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.bootgroupId>
                            <artifactId>spring-boot-configuration-processorartifactId>
                        exclude>
                    excludes>
                configuration>
            plugin>
        plugins>
    build>

你可能感兴趣的:(SpringBoot2,spring,spring,boot,自动配置原理,配置文件)