Spring Boot自定義starters

starter:

  • 這個場景需要使用到的依賴是什麼?
  • 如何編寫自動配置
  • /**
     * 以WebMvcAutoConfiguration爲例
     */
    
    //指定這個類是一個配置類
    @Configuration(proxyBeanMethods = false)
    //@ConditionalOnXXX: 在指定條件成立的情況下自動配置類生效
    @ConditionalOnWebApplication(type = Type.SERVLET)
    @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    //指定自動配置類的順序
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
    @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
    //給容器中添加組件
    @Bean
    
    //結合相關xxxProperties類來綁定相關的配置
    @ConfigurationPropertie
    //讓xxxProperties生效加入到容器中
    @EnableConfigurationProperties
    
    //自動配置類要能加載
    //將需要啓動就加載的自動配置類,配置在META-INF/spring.factories
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
  • 模式 
    • 啓動器只用來做依賴導入

    • 專門來寫一個自動配置模塊

    • 啓動器依賴自動配置,別人只需要引入啓動器(starter

    • mybatis-spring-boot-starter,自定義啓動器名-spring-boot-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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.atguigu.starter</groupId>
        <artifactId>atguigu-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--啓動器-->
        <dependencies>
    
            <!--引入自動配置模塊-->
            <dependency>
                <groupId>com.atguigu.starter</groupId>
                <artifactId>atguigu-spring-boot-starter-autoconfigurer</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    
    </project>
  • 自動配置模塊
  • <?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>
    
       <groupId>com.atguigu.starter</groupId>
       <artifactId>atguigu-spring-boot-starter-autoconfigurer</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <packaging>jar</packaging>
    
       <name>atguigu-spring-boot-starter-autoconfigurer</name>
       <description>Demo project for Spring Boot</description>
    
       <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>1.5.10.RELEASE</version>
          <relativePath/> <!-- lookup parent from repository -->
       </parent>
    
       <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <java.version>1.8</java.version>
       </properties>
    
       <dependencies>
          <!--引入spring-boot-starter;所有starter的基本配置-->
          <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
          </dependency>
       </dependencies>
    
    </project>
    
  • package com.atguigu.starter;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "atguigu.hello")
    public class HelloProperties {
    
        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;
        }
    }
  • package com.atguigu.starter;
    
    public class HelloService {
    
        HelloProperties helloProperties;
    
        public HelloProperties getHelloProperties() {
            return helloProperties;
        }
    
        public void setHelloProperties(HelloProperties helloProperties) {
            this.helloProperties = helloProperties;
        }
    
        public String sayHellAtguigu(String name){
            return helloProperties.getPrefix()+"-" +name + helloProperties.getSuffix();
        }
    }
    
  • package com.atguigu.starter;
    
    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)
    public class HelloServiceAutoConfiguration {
    
        @Autowired
        HelloProperties helloProperties;
        @Bean
        public HelloService helloService(){
            HelloService service = new HelloService();
            service.setHelloProperties(helloProperties);
            return service;
        }
    }
  • spring.factories:用來引用自動配置類
  • # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.atguigu.starter.HelloServiceAutoConfig
  • 根據順序將自動配置類生成jar包
  • 重新生成新的項目
  • 在pom文件中添加依賴
  • <!--引入自定義的Starter-->
    <dependency>
        <groupId>com.atguigu.starter</groupId>
        <artifactId>atguigu-spring-boot-starter-autoconfigurer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  • 寫一個測試類Controller
  • @RestController
    public class HelloController {
    
        @Autowired
        HelloService helloService;
    
        @GetMapping("/hello")
        public String hello(){
            return helloService.sayHelloAtguigu("haha");
        }
    }
  • 在application.properties中添加一些參數
  • atguigu.hello.prefix=ATGUIGU
    atguigu.hello.suffix=HELLO WORLD
  • 運行項目
  • 說明我們寫的自動配置類可以用!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章