156. Spring Boot自定义Starter【从零开始学Spring Boot】

 

【视频 & 交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

 

       Spring Boot由很多的Stater构成,需要使用什么,只需要引入spring-boot-start-xxx即可。当然我们自己也可以编写一个starter供其它的项目进行使用。

本节大纲:

(1)工作原理
(2)例子说明
(3)编写思路
(4)stater命名说明
(5)新建项目
(6)引入依赖
(7)编写service
(8)编写配置类
(9)编写autoconfigure
(10)编写spring.factories
(11)引入测试

 

 

       接下来看下具体的内容:

1)工作原理

写道
(a)Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包;
(b)根据spring.factories配置加载AutoConfigure类
(c)根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context

 

 

2)例子说明

       在这里我们编写一个计算器的stater提供加减乘除服务。

 

3)编写思路

写道
(a)首先我们需要有一个service,里面有加减乘除方法;
(b)我们需要有一个properties配置类,支持一些配置,比如:保留精度;
(c)需要有一个AutoConfigure注册计算器service;
(d)需要配置spring.factories,供spring扫描。

 

 

4stater命名说明

       Spring 官方 Starter通常命名为spring-boot-starter-{name} spring-boot-starter-web Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式。

 

5)新建项目

       我们这里新建一个stater项目,取名为calculate-spring-boot-stater(符合非官方的starter命名要求)

 

6)引入依赖

       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>com.kfit</groupId>
  <artifactId>calculate-spring-boot-stater</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
 
  <name>calculate-spring-boot-stater</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>
        </dependency>
  </dependencies>
 
  <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.4.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
  </dependencyManagement>
   
</project>

 

       这里使用了dependencyManagement,不懂的可以看上一篇文章《Spring Boot  dependenciesdependencyManagement的区别》

 

7)编写service

       编写CalculateService提供加减乘除方法,这里的scale一方面可以通过方法设置,另外一方面,可以使用配置文件进行默认设置:

package com.kfit.calculator.service;
 
import java.math.BigDecimal;
 
/**
 * 计算器.
 * @author Angel --守护天使
 * @version v.0.1
 * @date 2017年8月23日
 */
public class CalculateService {
   
    //这个从配置文件获取,就是默认的scale.
    private int scale;
   
    public CalculateService(int scale) {
       this.scale = scale;
    }
    /**
     * 加法.
     * @param a
     * @param b
     * @return
     */
    public double add(double v1,double v2){
       return v1+v2;
    }
   
    /**
     * 减法
     * @param a
     * @param b
     * @return
     */
    public double sub(double v1,double v2){
       return v1-v2;
    }
   
    /**
     * 除法.
     * @param a
     * @param b
     * @return
     */
    public double div(double v1,double v2){
       return v1/v2;
    }
   
    /**
     * 乘法.
     * @param a
     * @param b
     * @return
     */
    public double mul(double v1,double v2){
       return v1*v2;
    }
   
   
    /**
     * 精确到小数点以后scale位,以后的数字四舍五入。
     * @param v1
     *            数
     * @param scale
     *            保留精度.
     * @return两个参数的商
     */
    public double setScale(double v,int scale){
       return new BigDecimal(v).setScale(scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
   
    /**
     * 精确到小数点以后scale位,以后的数字四舍五入。
     * @param v1
     *            数
     * @param scale
     *            保留精度.
     * @return两个参数的商
     */
    public double setScale(double v){
       return new BigDecimal(v).setScale(scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

 

 

8)编写配置类

       编写CalculateProperties 这里只有一个字段,为了讲解需要,实际上可以根据需要任意添加需要的配置:

package com.kfit.calculator.properties;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
 
@ConfigurationProperties("calculate")
public class CalculateProperties {
    private int scale;
 
    public int getScale() {
       return scale;
    }
 
    public void setScale(int scale) {
       this.scale = scale;
    }
}

 

 

9)编写autoconfigure

       编写CalculateAutoConfigure自动配置类:

package com.kfit.calculator.config;
 
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;
 
import com.kfit.calculator.properties.CalculateProperties;
import com.kfit.calculator.service.CalculateService;
 
@Configuration
@ConditionalOnClass(CalculateService.class)
@EnableConfigurationProperties(CalculateProperties.class)
public class CalculateAutoConfigure {
 
    @Autowired
    private CalculateProperties calculateProperties;
   
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix="calculate",value="enabled",havingValue="true")
    public CalculateService calculateService(){
       return new CalculateService(calculateProperties.getScale());
    }
}

 

解释下用到的几个和Starter相关的注解:

@ConditionalOnClass,当classpath下发现该类的情况下进行自动配置。

@ConditionalOnMissingBean,当Spring Context中不存在该Bean时。

@ConditionalOnProperty(prefix = "calculate ",value = "enabled",havingValue = "true"),当配置文件中calculate.enabled=true时。

 

10)编写spring.factories

       最后在src/main/resources/META-INF下创建spring.factories文件,内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.kfit.calculator.config.CalculateAutoConfigure

到这里一个Spring Boot Starter便开发完成了。如果你要进行打包的时候,那么需要先安装下,执行命令:mvn:install打包安装,如果只是在另外一个项目引入测试的话,不执行打包也是可以运行的。

 

11)引入测试

创建一个Spring Boot项目来,这里省略项目的创建过程,引入我们只做的starter

       <dependency>
           <groupId>com.kfit</groupId>
           <artifactId>calculate-spring-boot-stater</artifactId>
           <version>0.0.1-SNAPSHOT</version>
       </dependency>

 

 

创建application.properties,进行配置:

calculate.enabled = true

calculate.scale = 2

 

 

编写controller进行访问测试:

package com.kfit;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.kfit.calculator.service.CalculateService;
 
@RestController
public class DemoController {
    @Autowired
    private CalculateService calculateService;
   
    //http://127.0.0.1:8080/add?v1=3&v2=5
    @RequestMapping("/add")
    public double add(double v1,double v2){
       return calculateService.add(v1, v2);
    }
   
    //http://127.0.0.1:8080/sub?v1=3&v2=5
    @RequestMapping("/sub")
    public double sub(double v1,double v2){
       return calculateService.sub(v1, v2);
    }
   
    //127.0.0.1:8080/div?v1=3&v2=5
    @RequestMapping("/div")
    public double div(double v1,double v2){
       return calculateService.div(v1, v2);
    }
   
    //127.0.0.1:8080/mul?v1=3&v2=5
    @RequestMapping("/mul")
    public double mul(double v1,double v2){
       return calculateService.mul(v1, v2);
    }
   
   
    //http://127.0.0.1:8080/setScale?v=3.454656&scale=3
    @RequestMapping("/setScale")
    public double setScale(double v,int scale){
       return calculateService.setScale(v,scale);
    }
   
    //http://127.0.0.1:8080/setScale2?v=3.454656  @RequestMapping("/setScale2")
    public double setScale(double v){
       return calculateService.setScale(v);
    }
   
}

 

       到这里就可以访问测试了:

http://127.0.0.1:8080/add?v1=3&v2=5

http://127.0.0.1:8080/sub?v1=3&v2=5

http://127.0.0.1:8080/div?v1=3&v2=5

http://127.0.0.1:8080/mul?v1=3&v2=5

http://127.0.0.1:8080/setScale?v=3.454656&scale=3

http://127.0.0.1:8080/setScale2?v=3.454656

 

 

 

 视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

 

 

猜你喜欢

转载自412887952-qq-com.iteye.com/blog/2395419