自定义springboot starter

我们在使用springboot的时候,感觉特别的方便易用。原因就是springboot官方提供了很多starter,我们需要使用什么功能,只需要引入对应的starter就可以了,大大简化了配置,这就是springboot当中约定大于配置特性。

那么这些starter到底是如何工作的呢?下面我们来自建一个自己的springboot starter,从而对里面的特性一探究竟。

项目名称

    spring官方的starter的名称一般都是下面的格式:spring-boot-starter-xxxxx,例如spring-boot-starter-actuator、spring-boot-starter-web

    而非官方的starter官方建议命名为:xxxxx-spring-boot-starter,所以新建一个springboot工程,命名这个工程为:userdefined-spring-boot-starter

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.fsl</groupId>
    <artifactId>userdefined-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>userdefined-spring-boot-starter</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging><!-- 必须有这个设置,否则无法执行maven install打包到maven仓库供别人引用 -->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    <!-- starter的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

自定义的配置属性

@ConfigurationProperties("my.defined")
public class MyDefinedProperties {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 家乡地址
     */
    private String hometown;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getHometown() {
        return hometown;
    }
    public void setHometown(String hometown) {
        this.hometown = hometown;
    }
    @Override
    public String toString() {
        return "MyDefinedProperties{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hometown='" + hometown + '\'' +
                '}';
    }
}

自定义的service

public class MyDefinedService {
    MyDefinedProperties myDefinedProperties;
    public MyDefinedProperties getMyDefinedProperties() {
        return myDefinedProperties;
    }
    public void setMyDefinedProperties(MyDefinedProperties helloProperties) {
        this.myDefinedProperties = helloProperties;
    }
    public String sayHello() {
        return String.format("[name=%s, age=%d, hometown=%s]",
                myDefinedProperties.getName(),
                myDefinedProperties.getAge(),
                myDefinedProperties.getHometown());
    }
}

加载service

@Configuration
//web工程生效
@ConditionalOnWebApplication
@EnableConfigurationProperties(MyDefinedProperties.class)
public class MyDefinedServiceAutoConfiguration {
    @Autowired
    MyDefinedProperties myDefinedProperties;
    @Bean
    @ConditionalOnMissingBean(MyDefinedService.class)
    @ConditionalOnProperty//存在对应配置信息时初始化该配置类
            (
                    prefix = "my.defined",//存在配置前缀my.defined
                    name = "enabled",
                    havingValue = "true",//开启
                    matchIfMissing = true//缺失检查
            )
    public MyDefinedService myDefinedService2() {
        MyDefinedService service = new MyDefinedService();
        service.setMyDefinedProperties(myDefinedProperties);
        return service;
    }
}


 配置启动类

    在resources目录下面,新建META-INF文件夹,里面建立spring.factories文件,文件内容如下:

#配置自定义Starter的自动化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fsl.userdefinedspringbootstarter.MyDefinedServiceAutoConfiguration

执行maven insatll打包命令

    项目的整体结构如下:
    

    执行maven install命令打包项目
    

别的项目引用这个starter

    在另外的工程当中引入对应的依赖

<!--引入自定义的starter-->
<dependency>
   <groupId>com.fsl</groupId>
   <artifactId>userdefined-spring-boot-starter</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>

配置属性

#设置自定义starter的参数
my.defined.name=ydd
my.defined.age=18
my.defined.hometown=jiangxi
my.defined.enabled = true

可以直接注入上面的service

@RestController
public class IndexController {

    @Autowired
    private MyDefinedService myDefinedService;

    @GetMapping("/index")
    public String index(){
        return myDefinedService.sayHello();
    }
}

运行结果


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值