⼀、码前必备知识
1、SpringBoot starter机制
SpringBoot中的starter是⼀种⾮常重要的机制,能够抛弃以前繁杂的配置,将其统⼀集成进starter,应⽤者只需要在maven中引⼊starter依赖,SpringBoot就能⾃动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会⾃动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对⽇常企业应⽤研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定⼤于配置”的理念。
2、为什么要⾃定义starter
在我们的⽇常开发⼯作中,经常会有⼀些独⽴于业务之外的配置模块,我们经常将其放到⼀个特定的包下,然后如果另⼀个⼯程需要复⽤这块功能的时候,需要将代码硬拷贝到另⼀个⼯程,重新集成⼀遍,⿇烦⾄极。如果我们将这些可独⽴于业务代码之外的功配置模块封装成⼀个个starter,复⽤的时候只需要将其在pom中引⽤依赖即可,SpringBoot为我们完成⾃动装配,简直不要太爽。
3、⾃定义starter的案例
以下案例由笔者⼯作中遇到的部分场景 ▲ 动态数据源。 ▲ 登录模块。
▲ 基于AOP技术实现⽇志切⾯。 。。。。。。
4、⾃定义starter的命名规则
SpringBoot提供的starter以spring-boot-starter-xxx的⽅式命名的。官⽅建议⾃定义的starter使⽤xxx-spring-boot-starter命名规则。以区分SpringBoot⽣态提供的starter。
5、代码地址
⼆、starter的实现⽅法
1、新建⼀个⼯程
命名为demo-spring-boot-starter 下图为⼯程⽬录结构
2、pom依赖
1
2 6 9 10 11 13 14 16 17 20 22 23 24 28 29
3、定义⼀个实体类映射配置信息
@ConfigurationProperties(prefix = \"demo\") 它可以把相同前缀的配置信息通过配置项名称映射成实体类,⽐如我们这⾥指定 prefix = \"demo\" 这样,我们就能将以demo为前缀的配置项拿到了。ps:其实这个注解很强⼤,它不但能映射成String或基本类型的变量。还可以映射为List,Map等数据结构。 1 package com.demo.starter.properties; 2
3 import org.springframework.boot.context.properties.ConfigurationProperties; 4 5 /**
6 * 描述:配置信息 实体 7 *
8 * @Author shf
9 * @Date 2019/5/7 22:0810 * @Version V1.011 **/
12 @ConfigurationProperties(prefix = \"demo\")13 public class DemoProperties {14 private String sayWhat;15 private String toWho;16
17 public String getSayWhat() {18 return sayWhat;19 }20
21 public void setSayWhat(String sayWhat) {22 this.sayWhat = sayWhat;23 }24
25 public String getToWho() {26 return toWho;27 }28
29 public void setToWho(String toWho) {30 this.toWho = toWho;31 }32 }
4、定义⼀个Service
1 package com.demo.starter.service; 2 3 /**
4 * 描述:随便定义⼀个Service 5 *
6 * @Author shf
7 * @Date 2019/5/7 21:59 8 * @Version V1.0 9 **/
10 public class DemoService {11 public String sayWhat;12 public String toWho;
13 public DemoService(String sayWhat, String toWho){14 this.sayWhat = sayWhat;15 this.toWho = toWho;16 }
17 public String say(){
18 return this.sayWhat + \"! \" + toWho;19 }20 }
5,定义⼀个配置类
这⾥,我们将DemoService类定义为⼀个Bean,交给Ioc容器。▲ @Configuration 注解就不多说了。
▲ @EnableConfigurationProperties 注解。该注解是⽤来开启对3步骤中 @ConfigurationProperties 注解配置Bean的⽀持。也就是@EnableConfigurationProperties注解告诉Spring Boot 能⽀持@ConfigurationProperties。
当然了,也可以在 @ConfigurationProperties 注解的类上添加 @Configuration 或者 @Component 注解
▲ @ConditionalOnProperty 注解控制 @Configuration 是否⽣效。简单来说也就是我们可以通过在yml配置⽂件中控制 @Configuration 注解的配置类是否⽣效。
1 package com.demo.starter.config; 2
3 import com.demo.starter.properties.DemoProperties; 4 import com.demo.starter.service.DemoService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 7 import org.springframework.boot.context.properties.EnableConfigurationProperties; 8 import org.springframework.context.annotation.Bean;
9 import org.springframework.context.annotation.Configuration;10 11 /**
12 * 描述:配置类13 *
14 * @Author shf
15 * @Date 2019/5/7 21:5016 * @Version V1.017 **/
18 @Configuration
19 @EnableConfigurationProperties(DemoProperties.class)20 @ConditionalOnProperty(21 prefix = \"demo\22 name = \"isopen\23 havingValue = \"true\"24 )
25 public class DemoConfig {26 @Autowired
27 private DemoProperties demoProperties;28
29 @Bean(name = \"demo\")
30 public DemoService demoService(){
31 return new DemoService(demoProperties.getSayWhat(), demoProperties.getToWho());32 }33 }
6、最重要的来了
如图,新建META-INF⽂件夹,然后创建spring.factories⽂件,
在该⽂件中加⼊如下配置,该配置指定上步骤中定义的配置类为⾃动装配的配置。(笔者努⼒最近把⾃动装配的博客写出来)1 #-------starter⾃动装配---------2 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.starter.config.DemoConfig
7、测试
在demo-spring-boot-starter⼯程中执⾏mvn clean install ⼀个⾃定义的starter新鲜出炉。新建测试⼯程引⼊starter依赖
1 2 3
1 demo.isopen=true
2 demo.say-what=hello3 demo.to-who=shf
然后写个测试类。
1 package com.example.test.controller; 2
3 import com.demo.starter.service.DemoService;
4 import org.springframework.web.bind.annotation.GetMapping; 5 import org.springframework.web.bind.annotation.RestController; 6
7 import javax.annotation.Resource; 8 9 /**
10 * 描述:11 *
12 * @Author shf
13 * @Description TODO14 * @Date 2019/5/13 15:5215 * @Version V1.016 **/
17 @RestController
18 public class DemoController {19 @Resource(name = \"demo\")
20 private DemoService demoService;21
22 @GetMapping(\"/say\")23 public String sayWhat(){24 return demoService.say();25 }26 27 } 浏览器
因篇幅问题不能全部显示,请点此查看更多更全内容