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中都有这样的参数:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
</parent>

       它的父项目是:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

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

        starter场景启动器格式

 <artifactId>spring-boot-starter-XXX</artifactId>

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

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

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

<properties>
        <mysql.version>5.1.43</mysql.version>
</properties>

1.2 自动配置

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

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

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

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

@SpringBootApplication(scanBasePackages="com.xxx")

        @SpringBootApplication等同于 

@SpringBootConfiguration
@EnableAutoConfiguration
@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模式
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

          //给容器中添加组件。以方法名作为组件的id。
    @Bean //返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());//设置张三的宠物
        return zhangsan;
    }

    @Bean("tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");//汤姆猫
    }
}

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

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

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

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

2.2原生配置文件引入

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

    <bean id="haha" class="com.boot.bean.User">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="18"></property>
    </bean>

    <bean id="hehe" class="com.boot.bean.Pet">
        <property name="name" value="tomcat"></property>
    </bean>
... ...
@ImportResource("classpath:beans.xml")
public class MyConfig {}

2.3 配置绑定

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

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

mycar.brand=benz
mycar.price=500000

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

@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
    ... ...
}

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

@Configuration(proxyBeanMethods=false)
@EnableConfigurationProperties(Car.class)
public class MyConfig{
    ... ...
}

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

三、自动配置原理

        引导加载自动配置类

        @SpringBootApplication 注解包含以下注解: 

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

        **@EnableAutoConfiguration 包含两个注解:

@AutoConfigurationPackage 
//利用Registrar给容器中导入一系列组件(用户定义的)
//默认情况下也就是MainApplication 所在包下。

@Import(AutoConfigurationImportSelector.class)
//给容器导入配置类组件
//扫描当前系统所有META-INF/spring.factories位置的文件,
//这些文件中写死了springboot启动时要加载的配置类(xxxxAutoConfiguration),
//虽然所有自动配置启动的时候默认全部加载。但xxxxAutoConfiguration会
//按照条件装配规则(@Conditional)最终按需配置。也就是导进来了但不一定生效

public @interface EnableAutoConfiguration {}

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

@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
}

        

总结:

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

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

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

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

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

四、Lombok插件

4.1简化JavaBean开发

        依赖:

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
</dependency>

        使用方式:

        注解:

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

@NoArgsConstructor
@Data
@ToString
@EqualsAndHashCode
public class User {

    private String name;
    private Integer age;

    private Pet pet;

    public User(String name,Integer age){
        this.name = name;
        this.age = age;
    }

4.2 简化日志开发

        @slf4j注解

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值