自定义Start

在我们的日常开发工作中,经常会遇到一些独立于业务之外的配置模块,我们会把它们放在一个特定的包下,其他工程需要复用这个功能时,需要将代码复制到另一个工程,重新集成一遍,非常麻烦,这时,我们就可以自定义starter了,将独立于业务代码之外的功能模块封装成一个starter,复用时只需要在pom文件中引入它的依赖即可,再由spring boot为我们完成自动装配,就非常轻松了.

自定义starter代码实现

整个过程分为两个部分:

1.自定义starter

2.使用starter

1.创建自定义starter

所谓的starter,其实就是一个普通的maven项目,因此我们需要先创建一个maven项目,然后为其添加Starter的自动化配置类即可

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.3.7.RELEASE</version>
            <scope>compile</scope>
        </dependency>

首先配置application.properties,内容如下:

qingqiao.name=zhangsan
qingqiao.msg=java 

配置完成后,先创建一个HelloProperties类,用来接收application.properties中注入的值,内容如下:

package org.qingqiao.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "qingqiao")
public class HelloProperties {
    private static final String DEFAULT_NAME = "大黄";
    private static final String DEFAULT_MSG = "Moto Morini";
    private String name = DEFAULT_NAME;
    private String msg = DEFAULT_MSG;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

@ConfigurationProperties类型安全的注入,是将application.properties中前缀为qingqiao的属性注入到类对应的属性上.

接下来我们定义一个HelloService,内容如下:

package org.qingqiao.service;

public class HelloService {
    private String msg;
    private String name;
    public String sayHello(){
        return name + "say" + msg + "!";
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

这是定义了一个简单的say方法,再往下就是我们的重轴戏了,定义自动配置类!!!

package org.qingqiao.service;

import org.qingqiao.pojo.HelloProperties;
import org.qingqiao.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
    @Autowired
    HelloProperties helloProperties;

    @Bean
    HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setName(helloProperties.getName());
        helloService.setMsg(helloProperties.getMsg());
        return helloService;
    }
}

@Configuration  注解表示这个一个配置类

@EnableConfigurationProperties  这个注解是我们之前配置的

@ConfigurationProperties 生效,让配置的属性成功的进入 Bean 中

@ConditionalOnClass 表示当项目当前 classpath 下存在 HelloService 时,后面的配置才生效

自动配置类中首先注入HelloProperties,这个实例中含有我们在application.properties中配置的相关数据

提供一个HelloService实例,将HelloProperties中的值注入进去

以上内容完成后,我们的自动化配置就算完成了,接下来会用到一个spring.factories的文件,至于这个文件到底是用来干嘛的呢?大家知道在我们spring boot项目创建完成后,在项目的启动类中有一个@SpringBootApplication注解,它的定义如下:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM,
				classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

@EnableAutoConfiguration 表示启用 Spring 应用程序上下文的自动配置,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,而这个类会去读取一个名为 spring.factories 的文件, 而spring.factories 中则定义需要加载的自动化配置类

因此,我们的自定义starter也需要这样的文件,首先我们在resources目录下创建一个名为META-INF的包,然后在里面创建一个spring.factories的文件,内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.qingqiao.service.HelloServiceAutoConfiguration

在这里指定我们的自动化配置类的路径即可,这样我们的自动化配置类就完成了

本地安装

在 IntelliJ IDEA 中,点击右边的 Maven Project ,然后选择 Lifecycle 中的 install ,双击即可,如下:

 双击完成后,这个Starter就案被撞到我们的本地仓库了

使用Starter

首先,我们新建一个SpringBoot工程,项目创建完成之后,加入我们自定义Starter的依赖,内容如下:

        <dependency>
            <groupId>org.qingqiao</groupId>
            <artifactId>mystarter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

这时,我们引入了上面的自定义Starter,所以我们的项目中现在有了一个默认的HelloService的实例可以使用,关于这个实例的数据,我们还可以在application.properties中进行配置,内容如下:

javaboy.name=晓飞
javaboy.msg=xcape650

配置完成后,我们在单元测试方法中注入HelloService实例进行使用,内容如下:

package org.qingqiao.mystarter;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.qingqiao.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UsemystarterApplicationTests {
    @Autowired
    HelloService helloService;
    @Test
    public void contextLoads() {
        System.out.println(helloService.sayHello());
    }
}

执行单元测试方法,打印如下:

这样,我们一个简单的自动化配置就算完成了

说一下练习时遇到的问题

 创建HelloProperties类时,@ConfigurationProperties 注解报错,报错内容如下:

 Spring Boot Configuration Annotation Processor not configured 这句话的意思是未配置Spring引导配置注释处理器

解决办法:

点击后面蓝色的字体

 

将这段代码复制到pom文件中即可

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Lay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值