spring-boot-starter简介

作者: kokokokokoishi | 来源:发表于2019-06-20 15:25 被阅读0次

    spring-boot 在配置上相比spring要简单许多, 其核心在于spring-boot-starter, 在使用spring-boot来搭建一个项目时, 只需要引入官方提供的starter, 就可以直接使用, 免去了各种配置, 原因在于spring-boot的自动发现,比如当classpath下面有tomcat-embedded.jar 时,对应的bean就会被加载.下面会介绍如何自己写一个简单的starter,并在自己的工程中使用这个starter
    新建一个maven project结构如下

    starter-greetor.png
    其中GreetorService是我们要提供给外部使用的bean, GreetorProperties包含了这个bean需要的信息, GreetorAutoConfiguration负责提供这个bean
    下面依次看一下各个class
    public class GreetorService {
    
        private GreetorProperties properties;
    
        public GreetorService(GreetorProperties properties) {
            this.properties = properties;
        }
    
        public String greet() {
            return "greet by" + properties.getName() + " msg " + properties.getMsg();
        }
    
    }
    

    GreetorService , 一个简单的service

    @ConfigurationProperties(prefix="greetor")
    public class GreetorProperties {
    
        private String name;
        
        private String msg;
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
        
    }
    

    properties bean, 会从application.properties 或 yml中把对应的properties映射到bean中

    @ConditionalOnClass(GreetorService.class)
    @EnableConfigurationProperties(GreetorProperties.class)
    @Configuration
    public class GreetorAutoConfiguration {
        
        @Autowired
        private GreetorProperties greetorProperties;
        
        @Bean
        @ConditionalOnMissingBean(GreetorService.class)
        public GreetorService greetorService() {
            return new GreetorService(greetorProperties);
        };
        
    }
    

    最为重要的class, @ConditionalOnClass 只有当特定的class在classpath上时, BeanDefination才会被注册, @ConditionalOnMissingBean 同理, @EnableConfigurationProperties 这个用于激活PropertyBean
    在META-INF中新建一个名为spring.factories的文件 (下文介绍其作用),内容为

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.iplay.springtest.configuration.GreetorAutoConfiguration
    

    最后看一下依赖

    <?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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.iplay.springtest</groupId>
        <artifactId>greeter-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>starter-greetor</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator-autoconfigure</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
    

    之后我们新建另一个maven project, 并依赖我们刚才建立的starter
    测试类 如下

    @SpringBootApplication
    public class StarterGreetorUsageApplication implements CommandLineRunner {
    
        @Autowired
        private GreetorService greetorService;
    
        @Override
        public void run(String... args) throws Exception {
            System.out.println(greetorService.greet());
        }
    
        public static void main(String args[]) {
            new SpringApplication(StarterGreetorUsageApplication.class).run(args);
        }
    
    }
    

    在application.properties中增加如下内容

    greetor.name=test
    greetor.msg=hello
    

    运行application 可以看到以下信息
    greet bytest msg hello
    下面我们看一下为什么GreetorAutoConfiguration会得到处理
    @SpringBootApplication 包含了@EnableAutoConfiguration, @EnableAutoConfiguration包含了@Import(AutoConfigurationImportSelector.class)
    @Import可以接受一个ImportSelector
    AutoAutoConfigurationImportSelectorImportSelector的实现
    其中核心代码为

    DeepinScrot-2248.png

    决定了哪些configuration会被import

    DeepinScrot-1015.png
    这里调用了getCandidateConfigurations
    DeepinScrot-1252.png
    SpringFactoriesLoader会从META-INF/spring.factories中读取对应的factory, 所以当我们启动项目时,会检查META-INF/spring.factories key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值.
    在spring-boot-autoconfigure这个包中也包含了spring.factories, 部分值为下
    DeepinScrot-2119.png
    对应了各个starter的autoconfiguration, 这些autoconfiguration使我们只需引入各个starter就能够快速搭建一个spring-boot app

    相关文章

      网友评论

        本文标题:spring-boot-starter简介

        本文链接:https://www.haomeiwen.com/subject/hwudqctx.html