springboot03:自定义AutoConfiguration


springboot03:自定义AutoConfiguration

在看完自动装配的原理后,今天来div一个AutoConfiguration的过程,巩固一下学到的知识。

步骤

1.建立自定义starter的package

2.通过maven把自定义starter引入

3.通过ApplicationContext容器使用

建立自定义starter的package

通过空maven新建一个starter模块,编写pom.xml文件

<!-- 产出是jar包  -->
<packaging>jar</packaging>
<!-- name;description -->
<name>MySpringBootStarter</name>
<description>Starter</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>11</java.version>
    <!--target 和 source是必须要设定的,并且需要和java.version一致,否则会有编译错误-->
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

<dependencies>
    <!--如果需要一个有starter的项目,有三个jar包是必须要引入的-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>2.7.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>2.7.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure-processor</artifactId>
        <version>2.7.1</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

建立三个类

xxxProperties 配置类

@ConfigurationProperties(prefix = "myservice")
public class MyServiceProperties {
    // 如果application.yaml中没有配置,需要自动配置缺省值
    private static final String MSG="aaaa";
    private String msg = MSG;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

xxxAutoConfiguration 自动装配类

@Configuration
@EnableConfigurationProperties({MyServiceProperties.class})
@ConditionalOnClass({MyService.class})
@ConditionalOnProperty(prefix = "myservice", value = "msg", matchIfMissing = true)
public class MyServiceAutoConfiguration {

    // 自动注入MyServiceProperties
    @Autowired
    private MyServiceProperties myServiceProperties;

    // 初始化MyService,并且放入容器
    @Bean
    @ConditionalOnClass(MyService.class)
    public MyService myService(){
        MyService myService = new MyService();
        // 从Properties文件中注入msg
        myService.setMsg(myServiceProperties.getMsg());
        return myService;
    }

}

xxx service类

public class MyService {

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String doSomething(){
        return "Hello! " + this.msg;
    }

}

在resources文件夹下新建一个META-INF文件夹,新建spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.silvercorridors.MyServiceAutoConfiguration

打包(package)

安装到本地仓库(install)

到这里,一个自动装配的架子就初步搭好了

在springboot中实现自动装配

在springboot项目中pom.xml引入刚才创建的自定义starter

<dependency>
    <groupId>cn.silvercorridors</groupId>
    <artifactId>MySpringBootStarter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

yaml配置文件添加配置信息(不设定则为默认值:aaaa)

Myservice:
  msg: abcd

在Controller中调用

@Controller
public class MyController {

    @Autowired
    private MyService myService;

    @RequestMapping("/r1")
    @ResponseBody
    public String r1(){
        return myService.doSomething();
    }
}

运行结果:实现自动配置

自定义AutoConfiguration运行结果

查询自动装配初始化信息

如果我们想要知道,AutoConfiguration在初始化时自动装配了哪些属性,可以通过如下操作来查看。

配置文件中

debugger: true

此时,再一次运行springboot启动类,会多出如下debug信息:

Positive matches

告诉了哪些AutoConfiguration被match了,告诉了被match的原因并且进行相应的操作

还有一些AutoConfiguration没有被match,告诉了没有被match的原因

Negative matches

这里我们可以看到MyServiceAutoConfiguration与其中的myService成员在启动时被匹配到了,因为满足了存在MyService.class的条件

MyService的match信息

这里的条件对应的就是MyServiceAutoConfiguration中的 @ConditionalOnClass(MyService.class)。


文章作者: 银色回廊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 银色回廊 !
评论
  目录