当前位置:   article > 正文

热插拔式组件定制-论Spring-boot-starter实现_spring-boot-starter-integration

spring-boot-starter-integration

一、前置知识点

学习本教程,需要一定前置知识点

1> 熟练使用Maven

2> 熟悉web体系

3> 熟练使用Spring/SpringMVC框架

4> 熟练使用SpringBoot框架

5> 熟悉java日志(演示案例)

二、引出starter

先来一个例子感受一下Spring-boot-starter简便性

需求:搭建一个web项目,访问:http://localhost:8080/hello 返回:Hello,浪飞yes

2.1 传统的SpringMVC

步骤1:创建项目-mvc-demo

步骤2:导入依赖包

  1. <properties>
  2. <spring.version>5.0.8.RELEASE</spring.version>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>11</maven.compiler.source>
  5. <maven.compiler.target>11</maven.compiler.target>
  6. </properties>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-webmvc</artifactId>
  11. <version>${spring.version}</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>javax.servlet</groupId>
  15. <artifactId>javax.servlet-api</artifactId>
  16. <version>3.0.1</version>
  17. <scope>provided</scope>
  18. </dependency>
  19. </dependencies>
  20. <build>
  21. <plugins>
  22. <plugin>
  23. <groupId>org.apache.tomcat.maven</groupId>
  24. <artifactId>tomcat7-maven-plugin</artifactId>
  25. <version>2.1</version>
  26. <configuration>
  27. <port>8080</port>
  28. <path>/</path>
  29. <uriEncoding>UTF-8</uriEncoding>
  30. </configuration>
  31. </plugin>
  32. </plugins>
  33. </build>

步骤3:web配置

在 resources 目录下新建 mvc.xml,配置如下:

  1. <!-- 配置 IoC DI 注解解析器,让 Spring 我们创建 HelloController 类的对象 -->
  2. <context:component-scan base-package="com.langfeiyes.mvc.controller"/>
  3. <!-- MVC 注解解析器 -->
  4. <mvc:annotation-driven/>

在 main 目录新建 webapp/WEB-INF/web.xml,内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  4. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. version="3.0">
  6. <!-- Spring MVC 前端控制器-->
  7. <servlet>
  8. <servlet-name>dispatcherServlet</servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10. <!-- 指定 Spring 容器启动加载的配置文件-->
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:mvc.xml</param-value>
  14. </init-param>
  15. <!-- Tomcat 启动初始化 -->
  16. <load-on-startup>1</load-on-startup>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>dispatcherServlet</servlet-name>
  20. <url-pattern>/</url-pattern>
  21. </servlet-mapping>
  22. </web-app>

步骤4:编写代码

  1. package com.langfeiyes.mvc.controller;
  2. @RestController
  3. public class HelloController {
  4. // 提供方法处理请求,在浏览器地址栏输入如下 localhost/hello,就会执行下面的方法
  5. @RequestMapping("/hello")
  6. public String save() {
  7. return "hello, 浪飞yes";
  8. }
  9. }

步骤5:测试

打开浏览器,在地址栏收入 http://localhost:8080/hello,访问看下效果。

2.2 叠加SpringBoot的Starter

步骤1:创建项目-starter-demo

步骤2:导入依赖包

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.3.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. </dependencies>

步骤3:编写代码

  1. @RestController
  2. public class HelloController {
  3. @RequestMapping("/hello")
  4. public String hello() {
  5. return "Hello,浪飞yes";
  6. }
  7. }

步骤4:测试

编写启动类启动项目

  1. @SpringBootApplication
  2. public class App {
  3. public static void main(String[] args) {
  4. SpringApplication.run(App.class, args);
  5. }
  6. }

打开浏览器,在地址栏收入 http://localhost:8080/hello,访问看下效果。

这里先记住Starter最显著特点:让开发变得更加简便

三、何为Starter

从上面2个web项目对比,你就会发现,叠加了SpringBoot 的SpringMVC操作,使用会更加简单,不会像传统的Spring MVC那样,一堆的 xml 配置文件,一旦 xml 配置时出现疏忽,整个项目可能莫名其妙的挂掉,如果xml文件多且复杂,你都不知道如何下手解决,这生无可恋感觉不好受。

但是,自从有了SpringBoot + Starter,你会发现世界再美好不过了~

那何为SpringBoot,何为Starter?

3.1 SpringBoot回顾

SpringBoot简单概括起来有着几点:

1> Jar 收集狂,收集各种常见第三方框架/组件的jar

2> 小工具爱好者,将收集起来的各种jar按照模块/功能进行分类汇总,得到更大的功能jar包:Starter

3>自动配置小能手,根据引入jar,自动往项目中加载各种功能

详细的SpringBoot操作这里不展开讲了,属于前置知识点,没基础的朋友,可以到我B站空间看SpringBoot入门视频。<<SpringBoot 入门到企业实战,从菜鸟到老鸟,只需要6个小时~>>

或者csdn课程

8小时带你入门到熟练-SpringBoot

3.2 SpringBoot启动器

Spring-boot-starter称之为SpringBoot启动器,由Spring Boot 根据应用程序所需的基本依赖项(jar)进行定制依赖库(jar)集合,可用于快速启动Spring应用程序。比如:导入spring-boot-starter-web便可引入整个mvc环境,导入:spring-boot-starter-Redis 便可以直接使用Redis数据库。

Spring-boot-starter被设计成可分离、可重用的热插拔式模块,大幅度地简化Spring程序的搭建过程以及提高程序设计灵活性。

3.3 常见的Spring-Boot-Starter

starter 分2种,

  • SpringBoot默认的,由Spring官方定制

命名方式 格式:spring-boot-starter-{模块名}

常见的Starter

  1. spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。
  2. spring-boot-starter-actuator 帮助监控和管理应用。
  3. spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议
  4. spring-boot-starter-aop 支持面向方面的编程即AOP,包括spring-aop和AspectJ。
  5. spring-boot-starter-artemis 通过Apache Artemis支持JMS的API(Java Message Service API)。
  6. spring-boot-starter-batch 支持Spring Batch,包括HSQLDB数据库。
  7. spring-boot-starter-cache 支持Spring的Cache抽象。
  8. spring-boot-starter-cloud-connectors 支持Spring Cloud Connectors,简化了在像Cloud Foundry或Heroku这样的云平台上连接服务。
  9. spring-boot-starter-data-elasticsearch 支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。
  10. spring-boot-starter-data-gemfire 支持GemFire分布式数据存储,包括spring-data-gemfire。
  11. spring-boot-starter-data-jpa 支持JPA(Java Persistence API),包括spring-data-jpa、spring-orm、hibernate。
  12. spring-boot-starter-data-MongoDB 支持MongoDB数据,包括spring-data-mongodb。
  13. spring-boot-starter-data-rest 通过spring-data-rest-webmvc,支持通过REST暴露Spring Data数据仓库。
  14. spring-boot-starter-data-solr 支持Apache Solr搜索平台,包括spring-data-solr。
  15. spring-boot-starter-freemarker 支持FreeMarker模板引擎。
  16. spring-boot-starter-groovy-templates 支持Groovy模板引擎。
  17. spring-boot-starter-hateoas 通过spring-hateoas支持基于HATEOAS的RESTful Web服务。
  18. spring-boot-starter-hornetq 通过HornetQ支持JMS。
  19. spring-boot-starter-integration 支持通用的spring-integration模块。
  20. spring-boot-starter-jdbc 支持JDBC数据库。
  21. spring-boot-starter-jersey 支持Jersey RESTful Web服务框架。
  22. spring-boot-starter-jta-atomikos 通过Atomikos支持JTA分布式事务处理。
  23. spring-boot-starter-jta-bitronix 通过Bitronix支持JTA分布式事务处理。
  24. spring-boot-starter-mail 支持javax.mail模块。
  25. spring-boot-starter-mobile 支持spring-mobile。
  26. spring-boot-starter-mustache 支持Mustache模板引擎。
  27. spring-boot-starter-Redis 支持Redis键值存储数据库,包括spring-redis。
  28. spring-boot-starter-security 支持spring-security。
  29. spring-boot-starter-social-facebook 支持spring-social-facebook
  30. spring-boot-starter-social-linkedin 支持pring-social-linkedin
  31. spring-boot-starter-social-twitter 支持pring-social-twitter
  32. spring-boot-starter-test 支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。
  33. spring-boot-starter-thymeleaf 支持Thymeleaf模板引擎,包括与Spring的集成。
  34. spring-boot-starter-velocity 支持Velocity模板引擎。
  35. spring-boot-starter-web S支持全栈式Web开发,包括Tomcat和spring-webmvc。
  36. spring-boot-starter-websocket 支持WebSocket开发。
  37. spring-boot-starter-ws 支持Spring Web Services。
  38. spring-boot-starter-remote-shell 增加了远程ssh shell的支持。
  39. spring-boot-starter-jetty 引入了Jetty HTTP引擎(用于替换Tomcat)。
  40. spring-boot-starter-log4j 支持Log4J日志框架。
  41. spring-boot-starter-logging 引入了Spring Boot默认的日志框架Logback。
  42. spring-boot-starter-tomcat 引入了Spring Boot默认的HTTP引擎Tomcat。
  43. spring-boot-starter-undertow 引入了Undertow HTTP引擎(用于替换Tomcat)
  • 第三方定制

根据SpringBoot开发的Starter定制规则,很多第三方组织结合SpringBoot定制自身的启动器。

命名方式 格式:{模块名}-spring-boot-starter

  1. mybatis-spring-boot-starter:该starter提供了MyBatis框架的集成支持,可以帮助开发人员更快地搭建基于MyBatis的应用程序。
  2. dubbospring-boot-starter:该starter提供了Dubbo分布式服务框架的集成支持,可以帮助开发人员更快地实现微服务架构。
  3. elasticsearch-spring-boot-starter:该starter提供了Elasticsearch搜索引擎的集成支持,可以帮助开发人员更快地搭建基于Elasticsearch的搜索服务。
  4. logstash-spring-boot-starter:该starter提供了Logstash日志收集框架的集成支持,可以帮助开发人员更快地集成Logstash服务。
  5. druid-spring-boot-starter:该starter提供了Druid数据库连接池的集成支持,可以帮助开发人员更快地实现数据库连接池功能。

四、如何定制Starter

在回答如何定制Starter之前,先要搞清楚一点:为何要定制?

4.1 为何要定制

在日常开发工作中,经常会有一些独立于业务之外的功能模块,传统做法:在项目中直接编码。如果另一个项目需要复用这功能模块时,需要将代码硬拷贝过去,然后重新集成一遍,这重复操作麻烦至极。如果将这些可独立于业务之外的功能模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,是不是很爽呢?

比如下面几个业务之外功能模块

1>通用模块-短信发送模块

2>基于AOP技术日志切面

3>分布式雪花Long类型ID精度损失问题

4>微服务项目的数据库连接池配置

5>微服务项目的Redis数据库引入问题

6>多模块项目鉴权组件引入问题

4.2 Starter定制实现

第一个案例,设计简单一点,简单拦截打印操作。

4.2.1 需求描述

需求:设计一个拦截starter,拦截项目中所有请求,打印配置好的info信息。

要求

通过yml中配置mvc.interceptor.show的值决定启用或者不启用

  1. mvc:
  2. interceptor:
  3. info: hello,浪飞yes
  4. show: true

 

4.2.2 实现步骤

1>创建一个项目:intercept-show-spring-boot-starter

2>导入相关依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.2.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. <scope>compile</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-configuration-processor</artifactId>
  16. <optional>true</optional>
  17. </dependency>
  18. </dependencies>

3>定义接收资源配置ShowProperties配置类

资源配置有2个:info/show

  1. mvc:
  2. interceptor:
  3. info: hello,浪飞yes...
  4. show: true

接收类

  1. package com.langfeiyes.mvc.prop;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. @ConfigurationProperties(prefix = "mvc.interceptor")
  4. public class ShowProperties {
  5. private boolean show = true;
  6. private String info;
  7. public boolean isShow() {
  8. return show;
  9. }
  10. public void setShow(boolean show) {
  11. this.show = show;
  12. }
  13. public String getInfo() {
  14. return info;
  15. }
  16. public void setInfo(String info) {
  17. this.info = info;
  18. }
  19. }

4>定义接拦截器-ShowInfoInterceptor

  1. package com.langfeiyes.mvc.interceptor;
  2. import com.langfeiyes.mvc.prop.ShowProperties;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.util.StringUtils;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class ShowInfoInterceptor implements HandlerInterceptor {
  9. @Autowired
  10. private ShowProperties showProperties;
  11. @Override
  12. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  13. if (showProperties.isShow()){
  14. if (StringUtils.hasText(showProperties.getInfo())) {
  15. System.out.println(showProperties.getInfo());
  16. }else{
  17. System.out.println("Hello,浪飞yes....");
  18. }
  19. }
  20. return true;
  21. }
  22. }

5>定义配置拦截器类--WebConfig

  1. package com.langfeiyes.mvc.config;
  2. import com.langfeiyes.mvc.interceptor.ShowInfoInterceptor;
  3. import com.langfeiyes.mvc.prop.ShowProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8. @Configuration
  9. public class WebConfig implements WebMvcConfigurer {
  10. @Bean
  11. public ShowProperties showProperties(){
  12. return new ShowProperties();
  13. }
  14. @Bean
  15. public ShowInfoInterceptor showInfoInterceptor(){
  16. return new ShowInfoInterceptor();
  17. }
  18. @Override
  19. public void addInterceptors(InterceptorRegistry registry) {
  20. registry.addInterceptor(showInfoInterceptor())
  21. .addPathPatterns("/**");
  22. }
  23. }

6>配置starter入口启动类/配置类-ShowInfoAutConfig

  1. package com.langfeiyes.mvc.config;
  2. import com.langfeiyes.mvc.interceptor.ShowInfoInterceptor;
  3. import com.langfeiyes.mvc.prop.ShowProperties;
  4. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
  6. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  7. import org.springframework.boot.context.properties.ConfigurationProperties;
  8. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.ComponentScan;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  13. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  14. @ConditionalOnProperty(name = "mvc.interceptor.show", matchIfMissing = false)
  15. @Configuration
  16. @ComponentScan("com.langfeiyes.mvc")
  17. public class ShowInfoAutConfig {
  18. }

ConditionalOnProperty:要求配置文件中有show属性,不存在时,默认为false,表示拦截器不生效。

ComponentScan:扫描指定的包,实现各组件加载

7>配置starter启动器入口--resources/META-INF/spring.factories

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.langfeiyes.mvc.config.ShowInfoAutConfig

4.2.3 使用测试

1>创建一个项目:mvc-starter-demo

2>导入相关依赖

  1. <!--父工程-->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.3.2.RELEASE</version>
  6. <relativePath/>
  7. </parent>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.langfeiyes.mvc</groupId>
  15. <artifactId>show-spring-boot-starter</artifactId>
  16. <version>1.0-SNAPSHOT</version>
  17. </dependency>
  18. </dependencies>

3>配置拦截starter

  1. mvc:
  2. interceptor:
  3. info: hello,dafei...
  4. show: true

4>编写controller发起web请求

  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. public class HelloController {
  5. @GetMapping("/hello")
  6. public String hello(){
  7. return "hello...fei~";
  8. }
  9. }

5>启动项目,并测试

  1. package com.langfei.mvc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class App {
  6. public static void main(String[] args) {
  7. SpringApplication.run(App.class, args);
  8. }
  9. }

1:打开浏览器,在地址栏收入 http://localhost:8080/hello,访问看下效果。

2:打开控制台,看拦截器的打印

3:将配置文件的show改为false再测试一次

  1. mvc:
  2. interceptor:
  3. info: hello,dafei...
  4. show: false

4:直接将配置文件删除,在试一下会怎样

五、Starter原理是啥

要讲请求starter的原理,必须先理解SpringBoot自动配置原理。

SpringBoot自动配置原理

  1. @SpringBootApplication
  2. public class App {
  3. public static void main(String[] args) {
  4. SpringApplication.run(App.class, args);
  5. }
  6. }

大白话:

1>项目启动后,SpringBoot会找去jar包下所有META-INF/spring.factories,读取其中预设的候选配置类。

2>然后根据导入依赖/配置文件去匹配候选配置类设置的@ConditionalOnXxx条件

3>当满足候选配置类的预设条件,该候选配置类会被激活,SpringBoot马上装配给配置类所有信息。

图片来源网络

 上图简化:

Starter实现原理其实也就是SpringBoot自动装配原理,区别在于需要手动定制starter自己的后续配置类。

案例中实例Starter执行过程

SpringBoot---->spring.factories--->候选的ShowInfoAutConfig配置类

--->匹配:@ConditionalOnClass/@ConditionalOnProperty--->满足条件开始装配

--->@ComponentScan("com.langfeiyes.mvc")--->加载配置:WebConfig--->拦截器配置成功

六、Starter实战案例

6.1 需求描述

需求:定制一个starter,当请求映射方法需要打日志时,贴上@Log注解即可。

要求:通过yml中配置mvc.log.enabled的值决定启用或者不启用

  1. mvc:
  2. log:
  3. enabled: true

6.2 实现步骤

1>创建一个项目:log-aspect-spring-boot-starteer

2>导入相关依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.2.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-configuration-processor</artifactId>
  15. <optional>true</optional>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-aop</artifactId>
  20. </dependency>
  21. </dependencies>

3>定义接收资源配置JobProperties配置类

资源暂时配置有1个:enabled

  1. mvc:
  2. log:
  3. enabled: true

接收类

  1. package com.langfeiyes.log.prop;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. @ConfigurationProperties(prefix = "mvc.log")
  4. public class LogProperties {
  5. private boolean enabled;
  6. public boolean isEnabled() {
  7. return enabled;
  8. }
  9. public void setEnabled(boolean enabled) {
  10. this.enabled = enabled;
  11. }
  12. }

4>定义日志注解-@Log

  1. @Target({ ElementType.PARAMETER, ElementType.METHOD })
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Log {
  5. }

5>定义日志切面类-LogAspect

  1. package com.langfeiyes.log.aspectj;
  2. import com.langfeiyes.log.annotation.Log;
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.annotation.AfterReturning;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.annotation.Before;
  7. import org.aspectj.lang.annotation.Pointcut;
  8. import org.springframework.stereotype.Component;
  9. @Aspect
  10. public class LogAspect{
  11. @Pointcut("@annotation(log)")
  12. public void webLog(Log log) {
  13. }
  14. @Before("webLog(log)")
  15. public void doBefore(JoinPoint joinPoint, Log log) {
  16. // 打印请求日志
  17. System.out.println("before" + log);
  18. }
  19. @AfterReturning(returning = "ret", pointcut = "webLog(log)")
  20. public void doAfterReturning(Object ret, Log log) {
  21. // 打印响应结果日志
  22. System.out.println("doAfterReturning" + log);
  23. }
  24. }

6>配置starter入口启动类/配置类-LogAspectEnableAutoConfiguration

  1. package com.langfeiyes.log.config;
  2. import com.langfeiyes.log.aspectj.LogAspect;
  3. import com.langfeiyes.log.prop.LogProperties;
  4. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.ComponentScan;
  8. import org.springframework.context.annotation.Configuration;
  9. @Configuration
  10. @EnableConfigurationProperties(LogProperties.class)
  11. @ConditionalOnProperty(name = "mvc.log.enabled", matchIfMissing = true)
  12. @ComponentScan("com.langfeiyes.log")
  13. public class LogAspectEnableAutoConfiguration {
  14. @Bean
  15. public LogProperties logProperties(){
  16. return new LogProperties();
  17. }
  18. @Bean
  19. public LogAspect logAspect(){
  20. return new LogAspect();
  21. }
  22. }

ConditionalOnProperty:要求配置文件中有enabled属性,不存在时,默认为false,表示日志不生效。

ComponentScan:扫描指定的包,实现各组件加载

7>配置starter启动器入口--resources/META-INF/spring.factories

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.langfeiyes.log.config.LogAspectEnableAutoConfiguration

6.3 使用测试

1>创建一个项目:mvc-log-demo

2>导入相关依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.2.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.langfeiyes.log</groupId>
  14. <artifactId>log-aspect-spring-boot-starteer</artifactId>
  15. <version>1.0.0</version>
  16. </dependency>
  17. </dependencies>

3>配置日志starter

  1. mvc:
  2. log:
  3. enabled: true

4>编写controller发起web请求

  1. package com.langfei.mvc.controller;
  2. import com.langfeiyes.log.annotation.Log;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class HelloController {
  7. @Log
  8. @GetMapping("/hello")
  9. public String hello(){
  10. return "ok-aspect";
  11. }
  12. }

5>启动项目,并测试

  1. package com.langfei.mvc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class App {
  6. public static void main(String[] args) {
  7. SpringApplication.run(App.class, args);
  8. }
  9. }

1:打开浏览器,在地址栏收入 http://localhost:8080/hello,访问看下效果。

2:打开控制台,看日志的打印

3:将配置文件的enabled改为false再测试一次

  1. mvc:
  2. log:
  3. enabled: false

4:直接将配置文件删除,在试一下会怎样

6.4 升级改造

改造@Log注解,让日志记录内容更加丰富

  1. @Target({ ElementType.PARAMETER, ElementType.METHOD })
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Log {
  5. //日志标题
  6. String title() default "";
  7. //操作类别
  8. OperType type() default OperType.OTHER;
  9. }

新加类型枚举类

  1. package com.langfeiyes.log.annotation;
  2. /**
  3. * 业务操作类型
  4. */
  5. public enum OperType
  6. {
  7. /**
  8. * 其他
  9. */
  10. OTHER,
  11. /**
  12. * 查
  13. */
  14. QUERY,
  15. /**
  16. * 新增
  17. */
  18. INSERT,
  19. /**
  20. * 修改
  21. */
  22. UPDATE,
  23. /**
  24. * 删除
  25. */
  26. DELETE,
  27. }

改造HelloController类

  1. package com.langfei.mvc.controller;
  2. import com.langfeiyes.log.annotation.Log;
  3. import com.langfeiyes.log.annotation.OperType;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class HelloController {
  8. @GetMapping("/hello")
  9. public String hello(){
  10. return "ok-aspect";
  11. }
  12. @Log(title = "员工查询", type = OperType.QUERY)
  13. @GetMapping("/emps/detail")
  14. public String detail(){
  15. return "ok-detail";
  16. }
  17. @Log(title = "员工添加", type = OperType.INSERT)
  18. @GetMapping("/emps/save")
  19. public String save(){
  20. return "ok-save";
  21. }
  22. }

启动App类访问下面路径,观察结果:

http://localhost:8080/emps/detail ---》当前执行操作是:员工查询-QUERY

http://localhost:8080/emps/save ---》当前执行操作是:员工添加-INSERT

到这,spring-boot-starter启动器的介绍就结束啦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/86664
推荐阅读
相关标签
  

闽ICP备14008679号