<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          只需4步,自己搞個(gè) Spring Boot Starter !

          共 5442字,需瀏覽 11分鐘

           ·

          2020-08-09 08:48

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 4 分鐘。

          作者 | 溫安適
          來源 | https://my.oschina.net/floor/blog/4435699

          引言

          只要你用Springboot,一定會用到各種spring-boot-starter。其實(shí)寫一個(gè)spring-boot-starter,僅需4步。下面我們就寫一個(gè)starter,它將實(shí)現(xiàn),在日志中打印方法執(zhí)行時(shí)間。

          第一步 創(chuàng)建maven項(xiàng)目

          在使用spring-boot-starter,會發(fā)現(xiàn),有的項(xiàng)目名稱是 XX-spring-boot-starter,有的是
          spring-boot-starter-XX,這個(gè)項(xiàng)目的名稱有什么講究呢?
          從springboot官方文檔摘錄如下:
          Do not start your module names with spring-boot, even if you use a different Maven groupId. We may offer official support for the thing you auto-configure in the future.
          As a rule of thumb, you should name a combined module after the starter.
          從這段話可以看出spring-boot-starter命名的潛規(guī)則。
          命名潛規(guī)則
          spring-boot-starter-XX是springboot官方的starter
          XX-spring-boot-starter是第三方擴(kuò)展的starter
          打印方法執(zhí)行時(shí)間的功能,需要用到aop,咱們的項(xiàng)目就叫做
          aspectlog-spring-boot-starter吧。
          項(xiàng)目的pom文件如下:


          <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.0modelVersion>

          ????<groupId>org.examplegroupId>
          ????<artifactId>aspectlog-spring-boot-starterartifactId>
          ????<version>1.0.2version>
          ????<parent>
          ????????<groupId>org.springframework.bootgroupId>
          ????????<artifactId>spring-boot-starter-parentartifactId>
          ????????<version>2.1.15.RELEASEversion>
          ????parent>
          ????
          ????<dependencies>
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-autoconfigureartifactId>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-starter-aopartifactId>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-configuration-processorartifactId>
          ????????????<optional>trueoptional>
          ????????dependency>
          ????dependencies>

          project>

          關(guān)于spring-boot-configuration-processor的說明,引自springBoot官方文檔:
          Spring Boot uses an annotation processor to collect the conditions on auto-configurations in a metadata file ( META-INF/spring-autoconfigure-metadata.properties ). If that file is present, it is used to eagerly filter auto-configurations that do not match, which will improve startup time. It is recommended to add the following dependency in a module that contains auto-configurations:

          org.springframework.boot

          spring-boot-autoconfigure-processor

          true

          簡單說就是:寫starter時(shí),在pom中配置spring-boot-autoconfigure-processor,在編譯時(shí)會自動收集配置類的條件,寫到一個(gè)META-INF/spring-autoconfigure-metadata.properties中。

          第二步寫自動配置邏輯

          各種condition

          本次我們就選用@ConditionalOnProperty。即配置文件中有aspectLog.enable=true,才加載我們的配置類。
          下面開始寫自動配置類

          2.1.定義AspectLog注解,該注解用于標(biāo)注需要打印執(zhí)行時(shí)間的方法。

          package?com.shanyuan.autoconfiguration.aspectlog;
          import?java.lang.annotation.ElementType;
          import?java.lang.annotation.Retention;
          import?java.lang.annotation.RetentionPolicy;
          import?java.lang.annotation.Target;
          /**
          ?*?class_name:?ScheduleManage
          ?*?describe:???用于控制定時(shí)任務(wù)的開啟與關(guān)閉
          ?*?對應(yīng)切面
          ?*?creat_user:?wenl
          ?*?creat_time:??2018/11/10?18:45
          ?**/

          @Target(ElementType.METHOD)
          @Retention(RetentionPolicy.RUNTIME)
          public?@interface???AspectLog?{
          }

          2.2定義配置文件對應(yīng)類

          package?com.shanyuan.autoconfiguration.aspectlog;
          import?org.springframework.boot.context.properties.ConfigurationProperties;

          @ConfigurationProperties("aspectLog")
          public?class?AspectLogProperties?{
          ????private?boolean?enable;
          ????public?boolean?isEnable()?{
          ????????return?enable;
          ????}
          ????public?void?setEnable(boolean?enable)?{
          ????????this.enable?=?enable;
          ????}
          }

          2.3定義自動配置類

          package?com.shanyuan.autoconfiguration.aspectlog;

          import?org.aspectj.lang.ProceedingJoinPoint;
          import?org.aspectj.lang.annotation.Around;
          import?org.aspectj.lang.annotation.Aspect;
          import?org.slf4j.Logger;
          import?org.slf4j.LoggerFactory;
          import?org.springframework.boot.autoconfigure.condition.*;
          import?org.springframework.context.annotation.Configuration;
          import?org.springframework.context.annotation.EnableAspectJAutoProxy;
          import?org.springframework.core.PriorityOrdered;

          @Aspect
          @EnableAspectJAutoProxy(exposeProxy?=?true,?proxyTargetClass?=?true)
          @Configuration
          @ConditionalOnProperty(prefix?=?"aspectLog",?name?=?"enable",
          ?????????????????????havingValue?=?"true",?matchIfMissing?=?true)
          public?class?AspectLogAutoConfiguration?implements?PriorityOrdered?{

          ????protected?Logger?logger?=?LoggerFactory.getLogger(getClass());

          @Around("@annotation(com.shanyuan.autoconfiguration.aspectlog.AspectLog)?")
          ????public?Object?isOpen(ProceedingJoinPoint?thisJoinPoint)?
          ????????????????????????????????????????throws?Throwable?
          {
          ????????//執(zhí)行方法名稱?
          ????????String?taskName?=?thisJoinPoint.getSignature()
          ????????????.toString().substring(
          ????????????????thisJoinPoint.getSignature()
          ????????????????????.toString().indexOf("?"),?
          ????????????????????thisJoinPoint.getSignature().toString().indexOf("("));
          ????????taskName?=?taskName.trim();
          ????????long?time?=?System.currentTimeMillis();
          ????????Object?result?=?thisJoinPoint.proceed();
          ????????logger.info("method:{}?run?:{}?ms",?taskName,?
          ????????????????????????????(System.currentTimeMillis()?-?time));
          ????????return?result;
          ????}
          ????@Override
          ????public?int?getOrder()?{
          ????????//保證事務(wù)等切面先執(zhí)行
          ????????return?Integer.MAX_VALUE;
          ????}
          }

          配置類簡要說明:

          @ConditionalOnProperty(prefix?=?"aspectLog",?name?=?"enable",havingValue?=?"true",?matchIfMissing?=?true)

          當(dāng)配置文件有aspectLog.enable=true時(shí)開啟,如果配置文件沒有設(shè)置aspectLog.enable也開啟。

          第三步META-INF/spring.factories

          META-INF/spring.factories是spring的工廠機(jī)制,在這個(gè)文件中定義的類,都會被自動加載。多個(gè)配置使用逗號分割,換行用\
          如果有興趣可以查看這2篇blog:
          2.@Enable驅(qū)動原理(設(shè)置連接)
          3.@EnableAutoConfiguration處理邏輯(設(shè)置連接)

          org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
          com.shanyuan.autoconfiguration.aspectlog.AspectLogAutoConfiguration

          第四步打包測試

          這是我們最終的目錄結(jié)構(gòu)
          在IDEA中,進(jìn)行mvn intall
          打包完成后,在其他項(xiàng)目中的pom中引入進(jìn)行測試

          參考資料
          • https://docs.spring.io/spring-boot/docs/2.1.15.RELEASE/reference/html/boot-features-developing-auto-configuration.html#boot-features-custom-starter

          推薦閱讀:

          這 3 個(gè)學(xué)數(shù)據(jù)結(jié)構(gòu)和算法的網(wǎng)站,相信你也會喜歡的!

          項(xiàng)目實(shí)踐:Spring Boot 三招組合拳,手把手教你打出優(yōu)雅的后端接口

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費(fèi)獲取!!

          微信掃描二維碼,關(guān)注我的公眾號

          寫留言

          朕已閱?

          瀏覽 49
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天干天天干素人 | 蜜桃视频一区二区三区四区a v | 亚洲一级无码在线观看 | 中曰韩一级片 | 亚洲无吗免费在线观看 |