SpringBoot自定义Starter

在我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,由SpringBoot为我们完成自动装配,下面提供一个自定义starter的开发流程:

创建Starter项目

首先我们要先创建一个starter项目,结构如下:
在这里插入图片描述
starter项目和SpringBoot工程结构没有什么区别,下面就把一些特殊的要求罗列一下。

  1. 命名规范
    1.1. SpringBoot官方命名方式
        格式:spring-boot-starter-{模块名}
        举例:spring-boot-starter-web
    1.2. 自定义命名方式
        格式:{模块名}-spring-boot-starter
        举例:mystarter-spring-boot-starter
  2. 必须引入的依赖包
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-configuration-processor</artifactId>
	</dependency>
定义Starter需要的配置(Properties)类

创建一个配置类(使用ConfigurationProperties注解标识,其中prefix="demo"是定义配置文件key的前缀),用于封装项目中使用到的配置:

package com.demo.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ConfigurationProperties(prefix = "demo")
public class MyDemoProperties {
    private String name;
    private String email;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
编写Starter项目的业务功能

开发自己的业务功能,为了简单,我们这边业务类只定义一个test方法:

package com.demo.service;
import com.demo.properties.MyDemoProperties;
import org.springframework.beans.factory.annotation.Autowired;
public class MyDemoService {
    public String name;
    public String email;
    public MyDemoService(){
    }
    public MyDemoService(String name, String email){
        this.name = name;
        this.email=email;
    }
    public String test(){
        String str = "name:" + name + ",email:" + email;
        System.out.println(str);
        return str;
    }
}
编写自动配置类

编写一个自动配置类(使用Configuration注解标识),我们用到了配置注入,所以还要加上EnableConfigurationProperties注解。在自动配置类中,定义我们的业务类(使用Bean注解),如下:

package com.demo.config;
import com.demo.properties.MyDemoProperties;
import com.demo.service.MyDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(MyDemoProperties.class)
public class MyDemoConfig {
    @Autowired
    private MyDemoProperties myProperties;

    @Bean(name = "demoService")
    public MyDemoService demoService(){
        return new MyDemoService(myProperties.getName(), myProperties.getEmail());
    }
}
编写spring.factories文件加载自动配置类

在这里插入图片描述
在resources目录下新建META-INF/spring.factories文件,文件内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.config.MyDemoConfig

其中com.demo.config.MyDemoConfig是我们上面自己定义的自动配置类,应按照你实际使用的定义即可。

打包安装

打包时需要注意一下,SpringBoot 项目打包的 JAR 是可执行 JAR,它的类放在 BOOT-INF 目录下,如果直接作为其他项目的依赖,会找不到类。
可以通过修改pom文件来解决,代码如下:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

改完后使用maven打包,会在target目录下生成两个JAR,如下:
在这里插入图片描述

  • mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar是一个可以被其他应用依赖的 JAR
  • mystarter-spring-boot-starter-0.0.1-SNAPSHOT-exec.jar 则是一个可执行 JAR

到目前为止一个自定义的starter项目就算开发完成了,下面我再介绍一下如何在其它项目中使用我们自定义的starter项目。

首先把可依赖包(mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar)安装至本地仓库或者公司公共仓库,这样就可以让其它项目使用了。下面是我在本地仓库安装的命令:

mvn install:install-file -Dfile=C:/doc/mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar -DgroupId=com.demo -DartifactId=mystarter-spring-boot-starter -Dversion=0.0.1 -Dpackaging=jar 
其它项目引用
  • pom文件中引入我们自定义的starter

       <dependency>
       	<groupId>com.demo</groupId>
           <artifactId>mystarter-spring-boot-starter</artifactId>
           <version>0.0.1</version>
       </dependency>
    
  • 配置文件中新增starter用到的配置
    在这里插入图片描述
    其中key的前缀demo前缀就是我们前面在配置类注解中定义的prefix=“demo”

  • 注入starter中的业务类

    package com.example.demospringboot.controller;
    import com.demo.service.MyDemoService;
    import com.example.demospringboot.model.UserInfo;
    import com.example.demospringboot.service.UserInfoService;
    import org.springframework.web.bind.annotation.*;
    
    import javax.annotation.Resource;
    @RestController
    @RequestMapping("mystarter")
    public class MyStarterDemoController {
        @Autowired
        private MyDemoService myDemoService;
    
        @GetMapping("/test")
        public String test(){
            return myDemoService.test();
        }
    }
    

    测试一下我们的最终功能,可以正常运作,如下:
    在这里插入图片描述

附starter源码路径:

https://github.com/xiaochao-github/mystarter-spring-boot-starter

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值