【视频 & 交流平台】
http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
https://gitee.com/happyangellxq520/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供其它的项目进行使用。
本节大纲:
(2)例子说明
(3)编写思路
(4)stater命名说明
(5)新建项目
(6)引入依赖
(7)编写service
(8)编写配置类
(9)编写autoconfigure
(10)编写spring.factories
(11)引入测试
接下来看下具体的内容:
(1)工作原理
(b)根据spring.factories配置加载AutoConfigure类
(c)根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context
(2)例子说明
在这里我们编写一个计算器的stater提供加减乘除服务。
(3)编写思路
(b)我们需要有一个properties配置类,支持一些配置,比如:保留精度;
(c)需要有一个AutoConfigure注册计算器service;
(d)需要配置spring.factories,供spring扫描。
(4)stater命名说明
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 dependencies与dependencyManagement的区别》
(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
视频&交流平台:
http://study.163.com/course/introduction.htm?courseId=1004329008
http://412887952-qq-com.iteye.com/blog/2321532