Spring Boot自定义starters

一、简介

SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。

二、如何自定义starter

1.实例

如何编写自动配置 ?

我们参照@WebMvcAutoConfiguration为例,我们看看们需要准备哪些东西,下面是WebMvcAutoConfiguration的部分代码:

@Configuration(proxyBeanMethods = false)
@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 })
public class WebMvcAutoConfiguration {

    @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
    @EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})
    public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {

        @Bean
        @ConditionalOnBean({View.class})
        @ConditionalOnMissingBean
        public BeanNameViewResolver beanNameViewResolver() {
            BeanNameViewResolver resolver = new BeanNameViewResolver();
            resolver.setOrder(2147483637);
            return resolver;
        }
    }
}

我们可以抽取到我们自定义starter时同样需要的一些配置。

@Configuration //指定这个类是一个配置类

@ConditionalOnXXX //指定条件成立的情况下自动配置类生效

@AutoConfigureOrder //指定自动配置类的顺序

@Bean //向容器中添加组件

@ConfigurationProperties //结合相关xxxProperties来绑定相关的配置

@EnableConfigurationProperties //让xxxProperties生效加入到容器中

自动配置类要能加载需要将自动配置类,配置在META-INF/spring.factories中 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

2.模式

我们参照 mybatis-spring-boot-starter 我们发现其中没有代码:

Spring Boot自定义starters_第1张图片

 我们在看它的pom中的依赖中有个 mybatis-spring-boot-autoconfigure

Spring Boot自定义starters_第2张图片

 关于mybatis的一些自动配置都写在了这里 ,所以我们有总结:

Spring Boot自定义starters_第3张图片

  • 启动器(starter)是一个空的jar文件,仅仅提供辅助性依赖管理,这些依赖可能用于自动装配或其他类库。
  • 需要专门写一个类似spring-boot-autoconfigure的配置模块
  • 用的时候只需要引入启动器starter,就可以使用自动配置了

命名规范

官方命名空间

  • 前缀:spring-boot-starter-
  • 模式:spring-boot-starter-模块名
  • 举例:spring-boot-starter-web、spring-boot-starter-jdbc

自定义命名空间

  • 后缀:-spring-boot-starter
  • 模式:模块-spring-boot-starter
  • 举例:mybatis-spring-boot-starter

三、自定义starter实例

我们需要先创建一个父maven项目:springboot_custome_starter

两个Module: fztx-spring-boot-starter 和 fztx-spring-boot-starter-autoconfigurer

Spring Boot自定义starters_第4张图片

springboot_custome_starter

pom.xml



    4.0.0
    
        fztx-spring-boot-starter-autoconfigurer
        fztx-spring-boot-starter
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.4
         
    
    pom
    com.springboot
    springboot_custome_starter
    0.0.1-SNAPSHOT
    springboot_custome_starter
    SpringBoot自定义starter
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter
        
    



 1. fztx-spring-boot-starter

1.pom.xml



    
        springboot_custome_starter
        com.springboot
        0.0.1-SNAPSHOT
    
    4.0.0

    fztx-spring-boot-starter

    
        启动器(starter)是一个空的jar文件,
        仅仅提供辅助性依赖管理,
        这些依赖需要自动装配或其他类库。
    

    
        8
        8
    

    
        
        
            com.springboot
            fztx-spring-boot-starter-autoconfigurer
        
    

    

如果使用spring Initializr创建的需要删除 启动类、resources下的文件,test文件。

2. fztx-spring-boot-starter-autoconfigurer

1. pom.xml



    
        springboot_custome_starter
        com.springboot
        0.0.1-SNAPSHOT
    
    4.0.0

    fztx-spring-boot-starter-autoconfigurer

    
        8
        8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        
    

2. FztxProperties

@ConfigurationProperties("fztx.hello")
public class FztxProperties {

        private String name;

        public String getName() {
        return name;
    }

        public void setName(String name) {
        this.name = name;
    }

}

3. IndexController

@RestController
public class IndexController {

    private FztxProperties fztxProperties;

    public IndexController(FztxProperties fztxProperties) {
        this.fztxProperties = fztxProperties;
    }

    @RequestMapping("/")
    public String index(){
        return fztxProperties.getName()+"欢迎您";
    }
}

4. FztxAutoConfitguration

/**
 * 给web应用自动添加一个首页
 */
@Configuration
@ConditionalOnProperty(value = "fztx.hello.name")
@EnableConfigurationProperties(FztxProperties.class)
public class FztxAutoConfitguration {
    @Autowired
    FztxProperties fztxProperties;

    @Bean
    IndexController indexController(FztxProperties fztxProperties){
        return new IndexController(fztxProperties);
    }
}

5. spring.factories

在 resources 下创建文件夹 META-INF 并在 META-INF 下创建文件 spring.factories ,内容如下:

Spring Boot自定义starters_第5张图片

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.fztx.FztxAutoConfitguration

到这儿,我们的配置自定义的starter就写完了 ,我们fztx-spring-boot-starter-autoconfigurer、fztx-spring-boot-starter 安装成本地jar包。

Spring Boot自定义starters_第6张图片

三、测试自定义starter

我们创建个Module: springboot_starter,来测试系我们写的stater。

1. pom.xml

        
            com.springboot
            fztx-spring-boot-starter
            0.0.1-SNAPSHOT
        

2.浏览

http://localhost:8080/

Spring Boot自定义starters_第7张图片

由于在自动配置上设置了 

@ConditionalOnProperty(value = "fztx.hello.name")

但我们还没有配置。so......

3. application.properties

fztx.hello.name="CSDN"

再次访问:http://localhost:8080/

Spring Boot自定义starters_第8张图片

你可能感兴趣的:(SpringBoot,spring,spring,boot,java)