您的当前位置:首页正文

SpringBoot应用篇(一):自定义starter

2024-03-19 来源:好走旅游网
SpringBoot应⽤篇(⼀):⾃定义starter

⼀、码前必备知识

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 4 4.0.0 5

6 org.springframework.boot 7 spring-boot-starter-parent 8 2.1.4.RELEASE

9

10 com.demo

11 demo-spring-boot-starter12 0.0.1-RELEASE

13 demo-spring-boot-starter

14 Demo project for Spring Boot15

16

17 1.818 19

20 21

22

23 org.springframework.boot

24 spring-boot-configuration-processor25 true26 27

28

29 org.springframework.boot30 spring-boot-starter31 32 33

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 com.demo

3 demo-spring-boot-starter4 0.0.1-RELEASE5 配置⽂件

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 } 浏览器

因篇幅问题不能全部显示,请点此查看更多更全内容