SpringBoot 源码解读系列(4) -- 自定义一个SpringBoot启动器

结果前面的SpringBoot源码级结构分析,我们已经知道了关于SpringBoot Starter的工作原来了,现在我们就来自定义一个Starter。

   1、项目结构

    首先我们来看下这个项目的结构

                                            SpringBoot 源码解读系列(4) -- 自定义一个SpringBoot启动器

 

                                              SpringBoot 源码解读系列(4) -- 自定义一个SpringBoot启动器

       上面就是这个项目的整体结构了

    2、SpringbootHello

    这个项目就是要注入的Service(HelloStarterService )

public class HelloStarterService {

    private String starterName;
    private String propertyName;

    public String helloStarter()
    {
        StringBuffer buffer = new StringBuffer();
        buffer.append(starterName).append(" Hello ").append(propertyName).append(" SpringBoot Starter");
        return buffer.toString();
    }

    public void setStarterName(String starterName) {
        this.starterName = starterName;
    }

    public void setPropertyName(String propertyName) {
        this.propertyName = propertyName;
    }
}
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-boot-starter-customize</artifactId>
        <groupId>com.fev.springboot</groupId>
        <version>1.0</version>
        <!--<relativePath>../pom.xml</relativePath>-->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.fev.springboot.hello</groupId>
    <artifactId>spring-boot-hello</artifactId>
    <version>1.0.0</version>

</project>

     3、SpringBootStarterAutoconfigure

      这个就是自动配置的逻辑,及读取配置文件(application.properties)的类

@ConfigurationProperties("spring.fev.property")
public class HelloStartProperties {

    private String customizeName;

    public void setCustomizeName(String customizeName) {
        this.customizeName = customizeName;
    }

    public String getCustomizeName() {
        return customizeName;
    }
}
@Configuration
@ConditionalOnClass({HelloStarterService.class})
@EnableConfigurationProperties(HelloStartProperties.class)
public class HelloStarterAutoConfigure {
    @Autowired
    private HelloStartProperties helloStartProperties;

    @Bean
    @ConditionalOnMissingBean(HelloStarterService.class)
    @ConditionalOnProperty(name = "spring.fev.customize",havingValue = "default",matchIfMissing = true)
    public HelloStarterService defaultHelloStarterService()
    {
        HelloStarterService helloStarterService = new HelloStarterService();
        helloStarterService.setStarterName("Default");
        helloStarterService.setPropertyName("Default");
        return helloStarterService;
    }

    @Bean
    @ConditionalOnMissingBean(HelloStarterService.class)
    @ConditionalOnProperty(name = "spring.fev.customize",havingValue = "customize")
    public HelloStarterService customizeHelloStarterService()
    {
        HelloStarterService helloStarterService = new HelloStarterService();
        helloStarterService.setPropertyName(helloStartProperties.getCustomizeName());
        helloStarterService.setStarterName("customize");
        return helloStarterService;
    }
}
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-boot-starter-customize</artifactId>
        <groupId>com.fev.springboot</groupId>
        <version>1.0</version>
        <!--<relativePath>../pom.xml</relativePath>-->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-starter-autoconfigure</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.fev.springboot.hello</groupId>
            <artifactId>spring-boot-hello</artifactId>
            <version>1.0.0</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

    4、SpringBootStarterHello

   这个就是hello-sevice的Starter

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-boot-starter-customize</artifactId>
        <groupId>com.fev.springboot</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-starter-hello</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.fev.springboot</groupId>
            <artifactId>spring-boot-starter-autoconfigure</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.fev.springboot.hello</groupId>
            <artifactId>spring-boot-hello</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.fev.autoconfigure.HelloStarterAutoConfigure

 以上就是我们这个项目的内容,下面我们来看其的使用

5、对Starter-Hello的使用

   对其的使用,我们只需要随便创建一个SpringBoot项目然后引入

<dependency>
   <groupId>com.fev.springboot</groupId>
   <artifactId>spring-boot-starter-hello</artifactId>
   <version>1.0</version>
</dependency>

  就能直接进行HelloStarterService的注入使用了,例如创建一个Controller

@RestController
public class MyController {

    @Autowired
    private HelloStarterService helloStarterService;

    @GetMapping("/hello")
    public String get() throws IllegalAccessException {
        return helloStarterService.helloStarter();
    }
}

  我们先不配置application.yml(properties)文件,直接启动请求:

                              SpringBoot 源码解读系列(4) -- 自定义一个SpringBoot启动器

可以看到其在页面上打印的是默认的HelloStarterService,现在我们来修改下application文件,再启动访问

spring.fev.customize=customize
spring.fev.property.customizeName=Feverasa

                                         SpringBoot 源码解读系列(4) -- 自定义一个SpringBoot启动器

  可以看到其使用的就是我们自定义的信息了。