当前位置: 首页 > news >正文

springboot自定义starter

案例1:自定义starter中配置用户信息、接口访问。使用starter时在yml文件配置用户信息

1,创建自定义starter
1.1,创建starter工程xxx-spring-boot-starter并配置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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/></parent><groupId>cn.xxx</groupId><artifactId>xxx-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!--   lombok   --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency></dependencies>
</project>

1.2,创建配置属性类XXXProperties

/**读取配置文件转换为bean* */
@Data
@ConfigurationProperties(prefix = "xxx")
public class XXXProperties {private String name;private String address;
}

1.3,创建自动配置类XXXServiceAutoConfiguration

@Configuration
//启用配置属性类
@EnableConfigurationProperties(TQProperties.class)
public class TianQingAutoConfiguration {private TQProperties tqProperties;//通过构造方法注入配置属性对象HelloPropertiespublic TianQingAutoConfiguration(TQProperties tqProperties) {this.tqProperties = tqProperties;}//实例化UserInfo并载入Spring IoC容器@Bean@ConditionalOnMissingBeanpublic UserInfo userInfo(){return new UserInfo (tqProperties.getName(),tqProperties.getAddress());}
}

1.4,在resources目录下创建META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.meteorological.config.XXXAutoConfiguration

1.5,创建UserInfo

@Data
public class UserInfo {private String name;private String address;public UserInfo (String name, String address) {this.name = name;this.address = address;}
}

1.6,创建server类

@Service
public class DMService {@Autowiredprivate UserInfo userInfo;public String getInfo(){return userInfo.getName()+" address: "+userInfo.getAddress();}
}

2,使用starter
2.1,创建maven工程并配置pom.xml文件,加入自定义starter依赖

//省略
<dependencies><!--导入自定义starter--><dependency><groupId>cn.tianqing</groupId><artifactId>tianqing-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>

2.2,修改application.yml文件

xxx:name: xiaomingaddress: beijing

2.3,调用自定义starter中服务

@Component
public class CustomStarterTest {//注入自定义starter中的server类@AutowiredDMService dmService;@PostConstructpublic void task1() {System.out.println(dmService.getInfo());}
}

案例2:自定义拦截器记录服务执行时间

1.1,自定义starter的pom.xml文件中添加web依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

1.2,自定义MyLog注解

@Target(ElementType.METHOD)//仅在方法上使用
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {/*** 方法描述*/String desc() default "";
}

1.3,自定义日志拦截器MyLogInterceptor

/*** 日志拦截器*/
public class MyLogInterceptor extends HandlerInterceptorAdapter {private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HandlerMethod handlerMethod = (HandlerMethod)handler;//获得被拦截的方法对象Method method = handlerMethod.getMethod();//获得方法上的注解MyLog myLog = method.getAnnotation(MyLog.class);if(myLog != null){//方法上加了MyLog注解,需要进行日志记录long startTime = System.currentTimeMillis();startTimeThreadLocal.set(startTime);}return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerMethod handlerMethod = (HandlerMethod)handler;//获得被拦截的方法对象Method method = handlerMethod.getMethod();//获得方法上的注解MyLog myLog = method.getAnnotation(MyLog.class);if(myLog != null){//方法上加了MyLog注解,需要进行日志记录long endTime = System.currentTimeMillis();//ThreadLocal中获取开始时间Long startTime = startTimeThreadLocal.get();long optTime = endTime - startTime;System.out.println("方法执行时间:" + optTime + "ms");String requestUri = request.getRequestURI();//类名+方法名String methodName = method.getDeclaringClass().getName() + "." + method.getName();String methodDesc = myLog.desc();System.out.println("请求uri:" + requestUri);System.out.println("请求方法名:" + methodName);System.out.println("方法描述:" + methodDesc);}}
}

1.4,创建自动配置类MyLogAutoConfiguration,用于自动配置拦截器、参数解析器等web组件

/*** 配置类,用于自动配置拦截器、参数解析器等web组件*/
@Configuration
public class MyLogAutoConfiguration implements WebMvcConfigurer{//注册自定义日志拦截器public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyLogInterceptor());}
}

1.5,在spring.factories中追加MyLogAutoConfiguration配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.meteorological.config.XXXAutoConfiguration,\
cn.meteorological.config.MyLogAutoConfiguration

2,使用自定义starter
2.1,Controller方法上加入@MyLog注解

@RestController
@RequestMapping("/hello")
public class HelloController {@Autowiredprivate HelloService helloService;//日志记录注解@MyLog(desc = "sayHello方法")@GetMapping("/say")public String sayHello(){return helloService.sayHello();}
}

2.2,访问地址:http://localhost:8080/hello/say,查看控制台输出:

请求uri:/hello/say
请求方法名:cn.meteorological.controller.HelloController.sayHello
方法描述:sayHello方法
方法执行时间:36ms

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【漏洞复现】某赛通数据泄露防护(DLP)系统 NetSecConfigAjax SQL注入漏洞
  • docker docker-compose创建容器并运行时发现redis.conf: Is a directory
  • springboot+neo4j的demo
  • 【论文分享】基于非参数方法和无所不在的兴趣点数据的子中心识别——以284个中国
  • tianai-captcha SpringBoot 行为验证码 支持滑动、旋转、文字点选等
  • 线程池概述
  • 在 FastAPI 项目中使用 Python 注解类型实现通用返回结构
  • docker的基本管理和应用
  • Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例
  • 【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存
  • 【C++ 秘籍】解锁 stack、queue 和 priority_queue 及容器适配器的神奇世界
  • haproxy七层代理
  • C++构造和析构
  • `torch.device(“mps“)`、pip华为镜像源dockerfile以及后缀安装
  • 华为OD笔试
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++入门教程(10):for 语句
  • IDEA 插件开发入门教程
  • JS笔记四:作用域、变量(函数)提升
  • mysql外键的使用
  • ng6--错误信息小结(持续更新)
  • passportjs 源码分析
  • Spark学习笔记之相关记录
  • SpiderData 2019年2月23日 DApp数据排行榜
  • windows下使用nginx调试简介
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 最近的计划
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​渐进式Web应用PWA的未来
  • ## 1.3.Git命令
  • #微信小程序:微信小程序常见的配置传旨
  • (30)数组元素和与数字和的绝对差
  • (python)数据结构---字典
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)js前端开发中设计模式之工厂方法模式
  • (五)c52学习之旅-静态数码管
  • .Net Core 笔试1
  • .NET NPOI导出Excel详解
  • .net 按比例显示图片的缩略图
  • .NET 材料检测系统崩溃分析
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @Repository 注解
  • @SpringBootApplication 注解
  • [AIGC] MySQL存储引擎详解
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BT]BUUCTF刷题第8天(3.26)
  • [C]编译和预处理详解
  • [C++进阶]map和set的相关题目
  • [Debugger]调试Arm设备
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [ERROR] Plugin 'InnoDB' init function returned error