zoukankan      html  css  js  c++  java
  • spring boot 自定义starter

    spring boot 使用 starter 解决了很多配置问题, 但是, 他是怎么来解决这些问题的呢? 主要的方式, 在前面见过一部分.  

    这里通过一个简单的例子, 来看一下, starter是怎么来设置默认配置的.

    一. 建 starter 项目

    自定义的starter, 项目命名规范是 : 自定义名-spring-boot-starter

    先来看一下, 我最后的目录结构

    1. 修改pom.xml文件

    <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>org.elvin</groupId>
      <artifactId>my-spring-boot-starter</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>my-spring-boot-starter</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-autoconfigure</artifactId>
          <version>1.5.9.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

    其实只是加入了 spring-boot-autoconfigure 

     App文件中的main方法, 我注释掉了, 这个在这里没有用到

    2. 配置属性对应的接收文件

    package org.elvin;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;/**
     * author: Elvin
     * Date: 2017/12/12 14:51
     * Description:
     */
    @ConfigurationProperties(prefix = "hello")
    public class HelloServiceProperties {
        //默认配置内容
        private static final String MSG = "world";
    
        private String msg = MSG;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

    3. 对外Service

    package org.elvin;
    
    /**
     * author: Elvin
     * Date: 2017/12/12 14:55
     * Description:
     */
    public class HelloService {
    
        private String msg;
    
        public String sayHello(){
            return "Hello " + msg;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

    4. 对外service与配置对应文件关联

    package org.elvin;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * author: Elvin
     * Date: 2017/12/12 14:59
     * Description:
     */
    @Configuration
    @EnableConfigurationProperties(HelloServiceProperties.class)
    @ConditionalOnClass(HelloService.class)
    @ConditionalOnProperty(prefix = "hello", value="enabled", matchIfMissing =true )
    public class HelloServiceAutoConfiguration {
    
        @Autowired
        private HelloServiceProperties helloServiceProperties;
    
        @Bean
        @ConditionalOnMissingBean(HelloService.class)
        public HelloService helloService(){
            HelloService helloService = new HelloService();
            helloService.setMsg(helloServiceProperties.getMsg());
            return helloService;
        }
    }

    5. starter配置 : spring.factories

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.elvin.HelloServiceAutoConfiguration

    做完这些之后, 通过 mvn clean install , 打包到maven库里面

    二. spring boot 项目使用

    新建一个spring boot 项目, 选择web即可.

    目录结构: 

    先看一下引用pom.xml

            <dependency>
                <groupId>org.elvin</groupId>
                <artifactId>my-spring-boot-starter</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

    再看一下HelloController

    package org.elvin.learn.springboot.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import  org.elvin.*;
    
    /**
     * author: Elvin
     * Date: 2017/12/12 15:34
     * Description:
     */
    @RestController
    @RequestMapping("hello")
    public class HelloController {
    
        @Autowired
        private HelloService helloService;
    
        @RequestMapping("index")
        public String index(){
            return helloService.sayHello();
        }
    
    }

    这里的 HelloService 就是 前面自定义 starter 里面的. 

    1. 结果: 未配置情况下, 应该是输出 hello world

    2. 在配置文件中, 加入 hello.msg=hahahahahah

    这个例子很简单, 只是显示一下主要的过程, 别的都是各插件自己的逻辑判断了.

    参考资料:

      JavaEE开发的颠覆者 Spring Boot实战

  • 相关阅读:
    canvas上的像素操作(图像复制,细调)
    AMD、CMD、CommonJS 和 ES6 模块化规范
    JS垃圾回收
    函数式编程中如何处理副作用?
    vue中的$on,$emit,$once,$off源码实现
    重新学习react生命周期
    keep alive实现原理
    读取 url 参数方法
    使用Bootstratp Blazor +EF Codefirst 愉快的增删改查!
    记录一下爬取微信小程序视频的过程!
  • 原文地址:https://www.cnblogs.com/elvinle/p/8028686.html
Copyright © 2011-2022 走看看