spring boot如何配置以及怎么实现自动装配

目录

配置第三方组件

步骤 1:添加依赖

步骤 2:配置数据源

步骤 3:配置 MyBatis-Plus

实现自动装配

自动扫描机制

 指定扫描包(使用别的包下的配置类时,指定包名来进行自动装配)

通过扫描spring.factories 文件(Spring Boot 2.7之前)

文件格式

后续使用方式

1. 自动配置类的定义

2. 自动配置类的加载

3. 条件化配置

文件格式与内容

工作原理

使用示例

1. 创建自动配置类

2. 创建 AutoConfiguration.imports 文件

3. 应用启动


配置第三方组件

@Configuration 注解

  • 用途@Configuration 注解用于定义配置类,本质上是一个特殊的 @Component,它标记的类会被 Spring 容器识别为配置类,通常会在该类中使用 @Bean 注解来定义和注册 Bean。
  • 适用场景
    • 定义和注册 Bean:当你需要在 Java 代码里手动定义和注册 Bean 时,可使用 @Configuration 注解。例如,配置数据库连接池、第三方组件的 Bean 等。
    • 步骤 1:添加依赖
       

      在 pom.xml 中添加 MyBatis-Plus 的依赖:

      
          com.baomidou
          mybatis-plus-boot-starter
          3.4.3.4
      
      步骤 2:配置数据源
       

      在 application.yml 中配置数据源信息:

      spring:
        datasource:
          url: jdbc:mysql://localhost:3306/testdb
          username: root
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver
      步骤 3:配置 MyBatis-Plus
       

      可以通过 Java 配置类来配置 MyBatis-Plus 的一些特性,例如分页插件:、

      import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
      import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class MyBatisPlusConfig {
      
          @Bean
          public MybatisPlusInterceptor mybatisPlusInterceptor() {
              MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
              interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
              return interceptor;
          }
      }

      实现自动装配

  • 自动扫描机制

Spring Boot 默认会扫描主应用类所在包及其子包下的所有带有特定注解的类。主应用类是指带有 @SpringBootApplication 注解的类。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

在上述代码中,DemoApplication 是主应用类,Spring Boot 会自动扫描 com.example.demo 包及其子包下的所有带有 @Component 及其派生注解的类,并将它们注册为 Spring Bean。

  •  指定扫描包(使用别的包下的配置类时,指定包名来进行自动装配)

如果需要扫描主应用类所在包之外的其他包,可以使用 @ComponentScan 注解。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.otherpackage", "com.example.anotherpackage"})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • 通过扫描spring.factories 文件(Spring Boot 2.7之前

文件格式

spring.factories 文件位于 META-INF 目录下,采用 Java 属性文件的格式,使用键值对的形式来指定接口和对应的实现类。键是接口的全限定名,值是实现类的全限定名,多个实现类之间用逗号分隔。示例如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration1,\
com.example.demo.MyAutoConfiguration2

后续使用方式

1. 自动配置类的定义

自动配置类通常使用 @Configuration 注解标记,并且可以结合其他注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)来实现条件化配置。示例如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
2. 自动配置类的加载

Spring Boot 在启动时,会自动扫描所有依赖库中的 META-INF/spring.factories 文件,并根据其中的配置信息加载相应的自动配置类。具体步骤如下:

  • 扫描 spring.factories 文件:Spring Boot 会在类路径下查找所有的 META-INF/spring.factories 文件。
  • 解析配置信息:解析 spring.factories 文件中的键值对,找到 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的自动配置类列表。
  • 加载自动配置类:根据解析得到的自动配置类列表,Spring Boot 会依次加载这些自动配置类,并根据其中的配置信息创建相应的 Bean。
3. 条件化配置

为了避免不必要的配置和 Bean 创建Spring Boot 提供了一系列条件注解,如 @ConditionalOnClass@ConditionalOnMissingBean 等。这些注解可以在自动配置类或 Bean 方法上使用,用于指定配置或 Bean 创建的条件。例如:避免一些不是基于SpringMVC 框架的服务但是引用了使用SpringMVC 框架的服务而导致的报错 所以利用条件来筛选  比如下面例子:我们都知道SpringMVC的核心api是DispatcherServlet  只要有SpringMVC就一定有DispatcherServlet,所以我们就基于这个条件来筛选使用SpringMVC 框架的服务,从而避免了报错。示例如下:

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

PS:

Spring Boot 3.0 后META -INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

替代了  spring.factories 部分功能的引入了新机制

  • 原因:spring.factories 存在一些性能问题,因为它在启动时会加载大量候选自动配置类,然后再通过条件注解进行筛选,这可能导致不必要的类加载和资源消耗。而 AutoConfiguration.imports 文件能更精准地指定要加载的自动配置类,减少了不必要的扫描和处理。

文件格式与内容

  • 位置:该文件位于 META - INF/spring 目录下。
  • 格式:文件内容非常简洁,每行一个自动配置类的全限定名,示例如下:
    com.example.demo.config.MyAutoConfiguration1
    com.example.demo.config.MyAutoConfiguration2

工作原理

其工作原理与spring.factories相似

  • 扫描加载:Spring Boot 启动时,会自动扫描类路径下所有的 META - INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。
  • 自动配置类加载:将文件中列出的自动配置类加载到自动配置流程中。这些自动配置类会像传统的自动配置类一样,根据 @Conditional 系列注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)进行条件判断,决定是否最终生效。

使用示例

1. 创建自动配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
2. 创建 AutoConfiguration.imports 文件

在 src/main/resources/META - INF/spring 目录下创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,内容如下:

com.example.demo.config.MyAutoConfiguration
3. 应用启动

当 Spring Boot 应用启动时,会自动加载 MyAutoConfiguration 类,并根据其中的配置创建 MyService Bean。

你可能感兴趣的:(spring,boot)