• SpringBoot-组件配置/自动配置原理/Lombok


    目录

    一、SpringBoot的特点

    1.1 依赖管理

    1.2 自动配置

    二、容器的功能

    2.1 添加组件

    2.2原生配置文件引入

    2.3 配置绑定

    三、自动配置原理

    四、Lombok插件

    4.1简化JavaBean开发

    4.2 简化日志开发


    一、SpringBoot的特点

    1.1 依赖管理

            每个SpringBoot项目的pom.xml中都有这样的参数:

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.3.4.RELEASEversion>
    5. parent>

           它的父项目是:

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-dependenciesartifactId>
    4. <version>2.3.4.RELEASEversion>
    5. parent>

            这个依赖中几乎声明所有开发中常用的依赖的版本号,自动版本仲裁机制。

            starter场景启动器格式

     <artifactId>spring-boot-starter-XXXartifactId>

             例如下面这个依赖就为我们导入了web相关的各种依赖。我们不需要手动设置版本号,因为父依赖会自动版本仲裁。如果引入了非版本仲裁的jar,则要写版本号。

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-webartifactId>
    4. dependency>

             如果要指定依赖的版本,要在当前项目的pom.xml中写配置参数,例如:

    1. <properties>
    2. <mysql.version>5.1.43mysql.version>
    3. properties>

    1.2 自动配置

            1.springboot会自动引入Tomcat依赖并配置tomcat服务器,我们自己不用配置。

            2.自动配好SpringMVC,配好常用组件

            3.SpringBoot帮我们配置好了所有web开发的常见场景。如字符编码问题、扫包

            4.主程序所在及其下面的所有子包里面的组件都会被默认扫描进来,想要改变扫描路径,在主程序的注解上修改:

    @SpringBootApplication(scanBasePackages="com.xxx")

            @SpringBootApplication等同于 

    1. @SpringBootConfiguration
    2. @EnableAutoConfiguration
    3. @ComponentScan("com.boot.xxx")

            -每个配置都是有默认值的,最终都映射到各个上-xxxxProperties

            -这些默认值绑定在各自的上,会在容器中创建对象

            -按需加载所有自动配置项,因为start太多了,只有引入了某些场景时,这个场景的自动配置才会开启

            -自动配置的功能都在 spring-boot-autoconfigure 包里面

    二、容器的功能

    2.1 添加组件

            我们可以手动添加组件:

            -配置类里面使用@Bean标注在方法上给容器注册组件默认也是单实例的,配置类本身也是组件

            -@Configuration的参数设置:proxyBeanMethods:代理bean的方法

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

    •     配置类组件之间无依赖关系Lite模式加速容器启动过程,减少判断
    •     配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用Full模式
    1. @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    2. public class MyConfig {
    3. //给容器中添加组件。以方法名作为组件的id。
    4. @Bean //返回类型就是组件类型。返回的值,就是组件在容器中的实例
    5. public User user01(){
    6. User zhangsan = new User("zhangsan", 18);
    7. //user组件依赖了Pet组件
    8. zhangsan.setPet(tomcatPet());//设置张三的宠物
    9. return zhangsan;
    10. }
    11. @Bean("tom")
    12. public Pet tomcatPet(){
    13. return new Pet("tomcat");//汤姆猫
    14. }
    15. }

            另外,也可以使用@import注解,让容器创建组件默认组件的名字是全类名

    1. @Import({User.class, DBHelper.class})
    2. @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    3. public class MyConfig {
    4. }

            @Conditional条件装配,即满足Conditional指定的条件才进行组件注入

            若加在上,则满足条件时这个类下面的组件才会创建;若加在方法(组件)上,则满足条件时这个组件才会创建。

    2.2原生配置文件引入

            @ImportResource可以引入原生配置文件中的Beans

    1. <bean id="haha" class="com.boot.bean.User">
    2. <property name="name" value="zhangsan">property>
    3. <property name="age" value="18">property>
    4. bean>
    5. <bean id="hehe" class="com.boot.bean.Pet">
    6. <property name="name" value="tomcat">property>
    7. bean>
    8. ... ...
    1. @ImportResource("classpath:beans.xml")
    2. public class MyConfig {}

    2.3 配置绑定

            其实就是把properties中的指定属性读取出来,封装到javaBean中,便于随时使用。

            第一步:在application.properties配置文件中设置好Bean的属性参数。

    1. mycar.brand=benz
    2. mycar.price=500000

            第二步:在javabean类上加注解 @ConfigurationProperties(prefix = "xxx")

    1. @ConfigurationProperties(prefix = "mycar")
    2. public class Car {
    3. private String brand;
    4. private Integer price;
    5. ... ...
    6. }

            第三步;在配置类上加注解 @EnableConfigurationProperties(xxx.class);或者在javabean类上加@conponent注解,标识为组件

    1. @Configuration(proxyBeanMethods=false)
    2. @EnableConfigurationProperties(Car.class)
    3. public class MyConfig{
    4. ... ...
    5. }

            这时我们使用@AutoWired注解创建Car对象就自带上面设置好的属性了。

    三、自动配置原理

            引导加载自动配置类

            @SpringBootApplication 注解包含以下注解: 

    1. @SpringBootConfiguration //代表当前是配置类
    2. @EnableAutoConfiguration
    3. @ComponentScan(excludeFilters = //扫描哪些包
    4. { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    5. public @interface SpringBootApplication{... ...}

            **@EnableAutoConfiguration 包含两个注解:

    1. @AutoConfigurationPackage
    2. //利用Registrar给容器中导入一系列组件(用户定义的)
    3. //默认情况下也就是MainApplication 所在包下。
    4. @Import(AutoConfigurationImportSelector.class)
    5. //给容器导入配置类组件
    6. //扫描当前系统所有META-INF/spring.factories位置的文件,
    7. //这些文件中写死了springboot启动时要加载的配置类(xxxxAutoConfiguration),
    8. //虽然所有自动配置启动的时候默认全部加载。但xxxxAutoConfiguration会
    9. //按照条件装配规则(@Conditional)最终按需配置。也就是导进来了但不一定生效
    10. public @interface EnableAutoConfiguration {}

            SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了,则以用户的优先:

    1. @Bean
    2. @ConditionalOnMissingBean
    3. public CharacterEncodingFilter characterEncodingFilter() {
    4. }

            

    总结:

    • SpringBoot先加载所有自动配置类 xxxxxAutoConfiguration
    • 每个自动配置类按照条件进行生效默认都会绑定配置文件指定的xxxxProperties里面拿。而xxxProperties配置文件进行了绑定
    • 生效的配置类就会给容器中装配很多组件
    • 定制化配置

                    用户直接自己@Bean替换底层的组件

                    用户去看这个组件是获取的配置文件中的什么,然后修改

            1xxxAutoConfiguration --(若满足条件)--> 创建组件 -> xxxxProperties里面拿默认值--

            2. --(若用户指定了值)--> application.properties(使用配置文件中的值

    四、Lombok插件

    4.1简化JavaBean开发

            依赖:

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. dependency>

            使用方式:

            注解:

    @NoArgsConstructor    //无参构造
    @AllArgsConstructor        //有参构造(所有参数)
    @Data       // get、set方法
    @ToString        //重写toString方法
    @EqualsAndHashCode   //重写equals、hashcode方法

    1. @NoArgsConstructor
    2. @Data
    3. @ToString
    4. @EqualsAndHashCode
    5. public class User {
    6. private String name;
    7. private Integer age;
    8. private Pet pet;
    9. public User(String name,Integer age){
    10. this.name = name;
    11. this.age = age;
    12. }

    4.2 简化日志开发

            @slf4j注解

    1. @Slf4j
    2. @RestController
    3. public class HelloController {
    4. @RequestMapping("/hello")
    5. public String handle01(){
    6. log.info("请求进来了....");//代替sout的功能,在控制台显示
    7. return "Hello, Spring Boot 2!";
    8. }
    9. }

  • 相关阅读:
    Leetcode88 合并两个有序数组
    频率合成器的高性能架构实现技术
    debian11 安装 postgress 数据库 -- chatGPT
    ArcGIS:如何利用站点数据(例如臭氧)进行克里金插值得到连续臭氧表面?
    HDI的盲孔设计,你注意到这个细节了吗?
    CentOS和Ubuntu命令行方式配置静态IP
    ChatGLM3-6B安装
    集合框架总结-set
    C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程
    23111710[含文档+PPT+源码等]计算机毕业设计基于SpringBoot的体育馆场地预约赛事管理系统的设计
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126108591