SpringBoot--自动配置原理入门

127 阅读4分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

回顾注解

==什么是元注解?==

元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。它的作用和目的就是给其他普通的标签进行解释说明的。

Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间

它的取值如下:

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

==@Documented有什么用?==

@Documented 保存到javadoc

顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。(Javadoc用于描述类或者方法的作用)

==@Target 限定使用场景== Target 是目标的意思,@Target 指定了注解运用的地方。当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。类比到标签,原本标签是你想张贴到哪个地方就到哪个地方,但是因为 @Target 的存在,它张贴的地方就非常具体了,比如只能张贴到方法上、类上、方法参数上等等。

@Target 有下面的取值:

  1. ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  2. ElementType.CONSTRUCTOR 可以给构造方法进行注解
  3. ElementType.FIELD 可以给属性进行注解
  4. ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  5. ElementType.METHOD 可以给方法进行注解
  6. ElementType.PACKAGE 可以给一个包进行注解
  7. ElementType.PARAMETER 可以给一个方法内的参数进行注解
  8. ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

==@Inherited 注解继承==

Inherited 是继承的意思,它的意思是@Inherited注解了B注解,B再注解别人,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解,代码来解释。

@Inherited@Retention(RetentionPolicy.RUNTIME)@interface Test {}@Testpublic class A {}public class B extends A {}

注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

@SpringBootConfiguration

这是注解@SpringBootConfiguration的源码,因为@Inherited注解

所以@SpringBootApplication注解的类继承了这个超类的三个注解@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

image-20220211114648764

之后我们在分别看这三个注解

image-20220211114734876

原来@SpringBootConfiguration是@Configuration是用来表示类为配置类的

@ComponentScan

Spring部分就学过,是知道扫描哪些,spring注解

@EnableAutoConfiguration

EnableAutoConfiguration的目的是启动SpringBoot的自动配置机制。

image-20220211115118579

  • @AutoConfigurationPackage:自动配置包
  • @Import:给IOC容器导入组件

@AutoConfigurationPackage

我们可以发现,依靠的还是@Import注解,再点进去查看,我们发现重要的就是以下的代码:

image-20220211115514409

它的作用就是在默认的情况下将主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。

==这个扫描的和Component扫描的对象不同==

比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由@AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/@Service/@Component/@Repository这些注解是由ComponentScan来扫描并加载的。

@Import(AutoConfigurationImportSelector.class)

使用Import自动导入所有符合自动配置条件的Bean定义并加载到IOC容器

总结

  • pringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

  • 生效的配置类就会给容器中装配很多组件

  • 只要容器中有这些组件,相当于这些功能就有了

  • 定制化配置

    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。

开发小技巧

lombok

lombok能简化JavaBean的开发

在pom文件里添加依赖

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

并在idea中下载插件

image-20220211161847670

以前的getset方法我们不用写了,通过注解@Data,它就可以在编译的时候自动生成getset方法了

image-20220211162046541

@NoArgsConstructor//为JavaBean添加无参构造@AllArgsConstructor//为JavaBean添加有参构造@Data@ToStringpublic class Pet {    private String name;}

==Slf4j==

简化日志开发

添加@Slf4j注解既有此功能

image-20220211162758254

dev-tools

项目或者页面修改以后:Ctrl+F9;

修改后的页面效果就会立马显示出来

<dependency>    
<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>    <optional>true</optional>
</dependency>

Spring Initailizr

==这个功能能帮我们快速构建SpringBoot项目==

如下:

image-20220211164712156

image-20220211164746394

选中想要开发的项目需要的组件

image-20220211164757887

目录结构直接给我们创建好了,而且SpringBoot的启动程序也写好了

我们只需要关注逻辑代码即可~

image-20220211165921287