老白的释然 发表于 2019-1-28 13:37:29

SpringBoot自定义starter

1,如何自定义 ①,我们首先要有一个意识,springboot自己适配的一般以:spring-boot-starter-xxx命名,比如:spring-boot-starter-amqp②,自己去适配springboot一般以:xxx-spring-boot-starter命名,比如:mybatis-spring-boot-starter③,springboot自动适配的在依赖时一般不用加版本号,自动适配springboot 的需要版本号。因为sprinboot根本就不知道它的版本③,通过观察mybatis-spring-boot-starter,我们发现mybatis-spring-boot-starter并没有java代码,通过观察其pom.xml我们发现,它引入了mybatis-spring-boot-autoconfigure④,所以我们可以仿照mybatis自定义我们的starter
2,创建工程①,创建一个空的mystart工程,新建两个模块,1,mystart;2,autoconfigurable
3,mystart模块配置
①,mystart依赖于autoconfigurable模块 <groupId>com.spring.start</groupId>
    <artifactId>mystart</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
      <dependency>
            <groupId>com.spring.start.autoconfigurable</groupId>
            <artifactId>autoconfigurable</artifactId>
            <version>0.0.1-SNAPSHOT</version>
      </dependency>
    </dependencies>

4,autoconfigurable工程代码①,pom.xml <groupId>com.spring.start.autoconfigurable</groupId>
      <artifactId>autoconfigurable</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>

      <name>autoconfigurable</name>
      <description>Demo project for Spring Boot</description>

      <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.0.0.RELEASE</version>
      </parent>

      <dependencies>
      <--依赖于springboot starter-->
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter</artifactId>
                </dependency>
      </dependencies>②,编写xxxProperties类,类似于ServerPropertiesimport org.springframework.boot.context.properties.ConfigurationProperties;

//这样才能读取到application.properties 中的相应配置
@ConfigurationProperties("spring.su")
public class SuProperties {

    private String prefix;
    private String suffix;

    public String getPrefix() {
      return prefix;
    }

    public void setPrefix(String prefix) {
      this.prefix = prefix;
    }

    public String getSuffix() {
      return suffix;
    }

    public void setSuffix(String suffix) {
      this.suffix = suffix;
    }
}③,编写功能类public class SuService {
    //这里不用@Autowired注入,会在自动配置类注入时给设置,所以才有setSuProperties 方法
    private SuProperties suProperties;

    public String hello(String name){
      return suProperties.getPrefix()+"--"+name+"=="+suProperties.getSuffix();
    }


    public SuProperties getSuProperties() {
      return suProperties;
    }

    public void setSuProperties(SuProperties suProperties) {
      this.suProperties = suProperties;
    }
}④,编写自动配置类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
//在web应用中起效
@ConditionalOnWebApplication
//指明配置类,这样SuProperties 才能被注入
@EnableConfigurationProperties({SuProperties.class})
public class SuAutoConfiguration {

    @Autowired
    private SuProperties suProperties;

    @Bean
    public SuService suService(){
      SuService suService = new SuService();
      suService.setSuProperties(suProperties);
      return suService;
    }
}⑤,添加对应的 META-INF/spring.factories⑥,spring.factories 内容,这样springboot在启动时会就扫描对应的AutoConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfiguration=com.spring.start.autoconfigurable.SuAutoConfiguration

5,mystart工程代码①,pom.xml 依赖于autoConfiguration 工程即可<groupId>com.spring.start</groupId>
    <artifactId>mystart</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
      <dependency>
            <groupId>com.spring.start.autoconfigurable</groupId>
            <artifactId>autoconfigurable</artifactId>
            <version>0.0.1-SNAPSHOT</version>
      </dependency>
    </dependencies>

6,测试工程代码编写①,pom.xml<parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.0.0.RELEASE</version>
      </parent>

      <dependencies>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
      <--依赖mystart 即可,mystart 会依赖autoconfigurable 工程,注意这里要指定版本号-->
                <dependency>
                        <groupId>com.spring.start</groupId>
                        <artifactId>mystart</artifactId>
                        <version>1.0-SNAPSHOT</version>
                </dependency>

                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-test</artifactId>
                        <scope>test</scope>
                </dependency>
      </dependencies>②,application.propertiesspring.su.prefix=小美女
spring.su.suffix=错过了③,测试类import com.spring.start.autoconfigurable.SuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @Autowired
    private SuService suService;

    @RequestMapping("/")
    public String index(){
      return suService.hello("小苏");
    }
}④,启动工程,然后测试即可,⑤,遗留问题,在application.properties 写的中文会乱码,暂时没有找到解决的办法,知道如何的同学欢迎留言,感谢!!!
页: [1]
查看完整版本: SpringBoot自定义starter