zoukankan      html  css  js  c++  java
  • 如何自定义Starter

    一、SpringBoot starter机制

    SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。

    二、为什么要自定义starter

    在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配。

    三、自定义starter的案例

    • 动态数据源。
    • 登录模块。
    • 基于AOP技术实现日志切面。
    • ......

    四、自定义starter的命名规则

    SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。

    五、starter的实现方法

    引入pom依赖
    <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</artifactId>
    </dependency>
    定义一个实体类映射配置信息

    @ConfigurationProperties(prefix = "demo") 它可以把相同前缀的配置信息通过配置项名称映射成实体类,比如我们这里指定 prefix = "demo" 这样,我们就能将以demo为前缀的配置项拿到了。

    @ConfigurationProperties(prefix = "demo")
    public class DemoProperties {
        private String sayWhat;
        private String toWho;
    
        public String getSayWhat() {
            return sayWhat;
        }
    
        public void setSayWhat(String sayWhat) {
            this.sayWhat = sayWhat;
        }
    
        public String getToWho() {
            return toWho;
        }
    
        public void setToWho(String toWho) {
            this.toWho = toWho;
        }
    }
    定义一个service
    public class DemoService {
        public String sayWhat;
        public String toWho;
        public DemoService(String sayWhat, String toWho){
            this.sayWhat = sayWhat;
            this.toWho = toWho;
        }
        public String say(){
            return this.sayWhat + "!  " + toWho;
        }
    }
    定义一个配置类

    我们将DemoService类定义为一个Bean,交给Ioc容器。

    @EnableConfigurationProperties 注解。该注解是用来开启对 @ConfigurationProperties 注解配置Bean的支持。也就是@EnableConfigurationProperties注解告诉Spring Boot 能支持@ConfigurationProperties。

    当然了,也可以在 @ConfigurationProperties 注解的类上添加 @Configuration 或者  @Component 注解

    @ConditionalOnProperty 注解控制 @Configuration 是否生效。简单来说也就是我们可以通过在yml配置文件中控制 @Configuration 注解的配置类是否生效。

    @Configuration
    @EnableConfigurationProperties(DemoProperties.class)
    @ConditionalOnProperty(
            prefix = "demo",
            name = "isopen",
            havingValue = "true"
    )
    public class DemoConfig {
        @Autowired
        private DemoProperties demoProperties;
    
        @Bean(name = "demo")
        public DemoService demoService(){
            return new DemoService(demoProperties.getSayWhat(), demoProperties.getToWho());
        }
    }
    提供spring.factories文件

    在resources目录下新建META-INF文件夹,然后创建spring.factories文件。

    在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置。

    #-------starter自动装配---------
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.starter.config.DemoConfig
    测试

    在demo-spring-boot-starter工程中执行mvn clean install 一个自定义的starter新鲜出炉。

    新建测试工程,引入starter依赖

    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>demo-spring-boot-starter</artifactId>
        <version>0.0.1-RELEASE</version>
    </dependency>

    配置文件

    demo.isopen=true
    demo.say-what=hello
    demo.to-who=shf

    测试类

    @RestController
    public class DemoController {
        @Resource(name = "demo")
        private DemoService demoService;
    
        @GetMapping("/say")
        public String sayWhat(){
            return demoService.say();
        }
    
    }

    转自:https://www.cnblogs.com/hello-shf/p/10864977.html

  • 相关阅读:
    终于搞明白Unicode,ASCII,UTF8,UCS2编码是啥了
    在IDEA中构建Tomcat项目流程
    在执行jar包时如何使用调优参数
    在浏览器运行JS脚本实现博客园文章批量删除
    线索二叉树之初步剖析(献给那些想形象思考二叉树遍历过程的人)
    二分查找c++实现
    c++学习之初话 函数指针和函数对象 的因缘
    继承与动态内存分配
    C++入门之初话多态与虚函数
    c++入门之类继承初步
  • 原文地址:https://www.cnblogs.com/myitnews/p/14066209.html
Copyright © 2011-2022 走看看