zoukankan      html  css  js  c++  java
  • Spring Boot自定义Starter

    spring boot为各种场景定义了各种starter,称之为场景启动器,引入starter依赖后,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置,你也可以自己配置一些属性。现在我们自己写一个Starter。

    首先看看官方文档对一个starter的要求:

    A full Spring Boot starter for a library may contain the following components:
      • The autoconfigure module that contains the auto-configuration code.
      • The starter module that provides a dependency to the autoconfigure module as well as the
        library and any additional dependencies that are typically useful. In a nutshell, adding the
        starter should provide everything needed to start using that library.
    大意就是必须包含自动配置模块,必须包括该starter所需的依赖。
     
    注意:自定义的spring boot starter有它的命名规范:
    xxx-spring-boot-starter
    下面项目的之前写的,这里就不改了。

    一:准备一个空项目

    其下有两个module,一个是starter,starter中只做引入依赖。
    一个是它的配置类,starter会依赖此配置类。

    空项目会要求新建module

     

    首先建立maven项目(starter)

     第二个项目,使用spring Initializr:

    不引入模块:

     apply->ok:

     二:改造starter和configure

    starter的pom.xml引入configure的依赖:

    <dependencies>
            <dependency>
                <groupId>com.sunsas</groupId>
                <artifactId>customer-spring-starter-autoconfigurer</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>

    starter改造完毕。

    configure中删除不用的东西:

     pom.xml中删除:

     上面是test模块,我们不需要。下面是打包插件,我们这里只是一个自动配置工具包,不需要。只有你的项目是一个web项目时,含有Main方法的程序入口类,要加该打包插件。

    否则会报错误:

    repackage failed: Unable to find main class

    configure继续添加一个类,这个类将会自动配置到项目中,如果别人引入了我们的starter,就可以使用此类的bean。

    public class HelloService {
    
        private HelloProperties helloProperties;
    
        public HelloProperties getHelloProperties() {
            return helloProperties;
        }
    
        public void setHelloProperties(HelloProperties helloProperties) {
            this.helloProperties = helloProperties;
        }
    
        public String hello(String name){
            return helloProperties.getPre() + "--" + name + "--" + helloProperties.getAfter();
        }
    }

    这里的HelloProperties是属性配置。

    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "sunsas.hello")
    public class HelloProperties {
        private String pre;
    
        private String after;
    
        public String getPre() {
            return pre;
        }
    
        public void setPre(String pre) {
            this.pre = pre;
        }
    
        public String getAfter() {
            return after;
        }
    
        public void setAfter(String after) {
            this.after = after;
        }
    }

    @ConfigurationProperties:

      告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
       prefix = "xxx":配置文件中哪个下面的所有属性进行一一映射

    idea在此类会报错,不用管:

     但是HelloProperties在HelloService没有初始化对象,那他是怎么调用的?

    那就需要下面的自动配置类了,需要HelloSerive中加上HelloProperties的get set方法。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConditionalOnWebApplication//只有web应用才起效
    @EnableConfigurationProperties(HelloProperties.class)//让HelloProperties生效,直接可以Autowired使用
    public class HelloServiceAutoConfiguration {
    
        @Autowired
        private HelloProperties helloProperties;
    
        @Bean
        public HelloService helloService(){
            HelloService helloService = new HelloService();
            helloService.setHelloProperties(helloProperties);
            return helloService;
        }
    }

    在这个配置类中,我们把HelloProperties给了HelloService,并且通过@Bean像容器中注册了HelloService。

    但是我们还得让这个配置类生效,我们仿造spring boot starter的配置类:

     

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    com.sunsas.HelloServiceAutoConfiguration

    至此我们starter就改造完毕。

    然后把两个项目安装到仓库中,注意首先安装自动配置类的,因为starter依赖于它:

    三:测试

     新建web工程,pom.xml引入我们的starter依赖:

    <dependency>
                <groupId>com.sunsas</groupId>
                <artifactId>customer-spring-starter</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

    我们的starter和配置类就导入进来了:

     写一个contorller:

    import com.sunsas.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class TestController {
        @Autowired
        private HelloService helloService;
    
        @GetMapping("/hello")
        public String test(){
            return helloService.hello("sunsas");
        }
    }

    @Autowired可能报错,不用管它。

    可以在配置文件中自定义配置我们starter的属性:

     

    启动项目,访问http://localhost:8080/hello:

    成功

  • 相关阅读:
    SSH框架——Sprign声明式事务
    SSH框架的简化
    Spring声明式事务管理
    简化注解shh框架
    ssh 的搭建
    基础篇-spring包的下载
    基础篇-struts2的搭建
    spring声明式事务管理
    shh简化
    shh(struts+spring+Hibernate)的搭建
  • 原文地址:https://www.cnblogs.com/SunSAS/p/12423297.html
Copyright © 2011-2022 走看看