<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 !

          共 5947字,需瀏覽 12分鐘

           ·

          2020-09-06 14:46

          引言

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

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

          在使用spring-boot-starter,會(huì)發(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:

          <dependency>
          ????<groupId>org.springframework.bootgroupId>
          ????<artifactId>spring-boot-autoconfigure-processorartifactId>
          ????<optional>trueoptional>
          dependency>

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

          第二步寫自動(dòng)配置邏輯

          各種condition

          類型注解說明
          Class Conditions類條件注解@ConditionalOnClass當(dāng)前classpath下有指定類才加載
          @ConditionalOnMissingClass當(dāng)前classpath下無指定類才加載
          Bean ConditionsBean條件注解@ConditionalOnBean當(dāng)期容器內(nèi)有指定bean才加載
          @ConditionalOnMissingBean當(dāng)期容器內(nèi)無指定bean才加載
          Property Conditions環(huán)境變量條件注解(含配置文件)@ConditionalOnPropertyprefix 前綴name 名稱havingValue 用于匹配配置項(xiàng)值matchIfMissing 沒找指定配置項(xiàng)時(shí)的默認(rèn)值
          ResourceConditions 資源條件注解@ConditionalOnResource有指定資源才加載
          Web Application Conditionsweb條件注解@ConditionalOnWebApplication是web才加載
          @ConditionalOnNotWebApplication不是web才加載
          SpEL Expression Conditions@ConditionalOnExpression符合SpEL 表達(dá)式才加載

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

          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)閉
          ?*?對(duì)應(yīng)切面
          ?*?creat_user:?wenl
          ?*?creat_time:??2018/11/10?18:45
          ?**/


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

          2.2定義配置文件對(duì)應(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定義自動(dòng)配置類

          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;
          ????}
          }

          配置類簡(jiǎn)要說明:

          @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è)文件中定義的類,都會(huì)被自動(dòng)加載。多個(gè)配置使用逗號(hào)分割,換行用\

          如果有興趣可以查看這2篇blog:

          2、@Enable驅(qū)動(dòng)原理(設(shè)置連接)

          3、@EnableAutoConfiguration處理邏輯(設(shè)置連接)

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

          第四步打包測(cè)試

          這是我們最終的目錄結(jié)構(gòu)

          97_1.png

          在IDEA中,進(jìn)行mvn intall

          97_2.png

          打包完成后,在其他項(xiàng)目中的pom中引入進(jìn)行測(cè)試


          作者 | 溫安適

          來源 |?https://my.oschina.net/floor/blog/4435699

          參考資料

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


          END



          免費(fèi)領(lǐng)取 1000+ 道面試資料!!小編這里有一份面試寶典《Java 核心知識(shí)點(diǎn).pdf》,覆蓋了 JVM,鎖、高并發(fā)、Spring原理、微服務(wù)、數(shù)據(jù)庫、Zookeep人、數(shù)據(jù)結(jié)構(gòu)等等知識(shí)點(diǎn),包含 Java 后端知識(shí)點(diǎn) 1000+ 個(gè),部分如下:

          如何獲取?加小編微信,回復(fù)【1024】



          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  操逼素材大全在线观看 | 免费大香蕉 | 黄色视频网站在线免费看 | 亚洲AV无码成人精品国产一区 | 欧美黄色免费网战 |