亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot自動(dòng)配置沒(méi)有生效的問(wèn)題定位(條件斷點(diǎn))

 更新時(shí)間:2019年06月27日 08:28:32   作者:空山新雨  
這篇文章主要介紹了springboot自動(dòng)配置未生效問(wèn)題定位,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)學(xué)習(xí)一下吧

Spring Boot在為開(kāi)發(fā)人員提供更高層次的封裝,進(jìn)而提高開(kāi)發(fā)效率的同時(shí),也為出現(xiàn)問(wèn)題時(shí)如何進(jìn)行定位帶來(lái)了一定復(fù)雜性與難度。但Spring Boot同時(shí)又提供了一些診斷工具來(lái)輔助開(kāi)發(fā)與分析,如spring-boot-starter-actuator。本文分享一個(gè)基于actuator與IDEA條件斷點(diǎn)來(lái)定位自動(dòng)配置未生效的案例。望對(duì)類(lèi)似問(wèn)題分析與處理提供參考。

問(wèn)題確認(rèn)

在前文介紹的 Spring Boot從入門(mén)到實(shí)戰(zhàn):整合通用Mapper簡(jiǎn)化單表操作 中,我們對(duì)druid連接池做了自動(dòng)配置,并且注入了druid的監(jiān)控統(tǒng)計(jì)功能,如下

但本地運(yùn)行后通過(guò) http://localhost:8080/druid/index.html訪問(wèn)時(shí)卻出現(xiàn)錯(cuò)誤,通過(guò)瀏覽器的開(kāi)發(fā)者工具查看該請(qǐng)求返回404,推測(cè)上述代碼中定義的StatViewServlet未注入成功。我們用actuator來(lái)確認(rèn)下是否如此。在項(xiàng)目中加入spring-boot-starter-actuator,并且application.yml中添加如下配置

management:
endpoints:
web:
exposure:
include: "*"
exclude: beans,trace
endpoint:
health:
show-details: always

在spring-boot 2.x 版本當(dāng)中,作為安全性考慮,將actuator 控件中的端口,只默認(rèn)開(kāi)放/health 和/info 兩個(gè)端口,其他端口默認(rèn)關(guān)閉, 因此需要添加如上配置。注意include的值 * 必須加引號(hào),否則無(wú)法啟動(dòng)。

重啟程序后訪問(wèn) http://localhost:8080/actuator/conditions確認(rèn)上述兩個(gè)實(shí)例化方法未滿(mǎn)足@ConditionalOnProperty的條件,從而未執(zhí)行生效,如圖

條件斷點(diǎn)

從上面分析確認(rèn)是因?yàn)闂l件注解 @ConditionalOnProperty(prefix = "spring.datasource.druid", name = "druidServletSettings") 未滿(mǎn)足使方法未執(zhí)行導(dǎo)致。那這個(gè)條件為什么沒(méi)有滿(mǎn)足呢,查看application.yml中也做了 spring.datasource.druid.druidServletSettings屬性的配置。

當(dāng)你無(wú)法理清頭緒,確定問(wèn)題原因時(shí),那就Debug吧。查看注解@ConditionalOnProperty源碼,找到其實(shí)現(xiàn)支持類(lèi)OnPropertyCondition,如下

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
String[] value() default {};
String prefix() default "";
String[] name() default {};
String havingValue() default "";
boolean matchIfMissing() default false;
}

查看OnPropertyCondition源碼,了解它是通過(guò)getMatchOutcome方法來(lái)判斷是否滿(mǎn)足注解參數(shù)所指定的條件的,如下所示

@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
List<AnnotationAttributes> allAnnotationAttributes = annotationAttributesFromMultiValueMap(
metadata.getAllAnnotationAttributes(
ConditionalOnProperty.class.getName()));
List<ConditionMessage> noMatch = new ArrayList<>();
List<ConditionMessage> match = new ArrayList<>();
for (AnnotationAttributes annotationAttributes : allAnnotationAttributes) {
ConditionOutcome outcome = determineOutcome(annotationAttributes,
context.getEnvironment());
(outcome.isMatch() ? match : noMatch).add(outcome.getConditionMessage());
}
if (!noMatch.isEmpty()) {
return ConditionOutcome.noMatch(ConditionMessage.of(noMatch));
}
return ConditionOutcome.match(ConditionMessage.of(match));
}

在調(diào)用determineOutcome處打斷點(diǎn),調(diào)試什么原因?qū)е聴l件未滿(mǎn)足,但是這里是一個(gè)for循環(huán),如果for元素過(guò)多的話(huà),將可能需要斷點(diǎn)阻斷很多次才能找到你想要查看的那個(gè)元素。

所幸IDEA提供了不同類(lèi)型的斷點(diǎn)來(lái)處理這類(lèi)問(wèn)題,這里介紹用條件斷點(diǎn)來(lái)處理這類(lèi)循環(huán)塊中的debug問(wèn)題。

在上述代碼for循環(huán)中調(diào)用determineOutcome行打斷點(diǎn),并在斷點(diǎn)上右鍵,彈出如下窗口

圖中Condition框即可輸入你要指定的條件,可以直接寫(xiě)java判斷表達(dá)式代碼,并引用該行代碼處能訪問(wèn)的變量,如這里我們輸入 annotationAttributes.get("name").equals("druidServletSettings"),然后點(diǎn)擊Debug窗口的“Resume Program (F9)”按鈕,則在不滿(mǎn)足指定條件時(shí),斷點(diǎn)處將不會(huì)被阻斷,直到條件滿(mǎn)足,這樣就能很容易定位到我們想要查看的元素。(當(dāng)然這里allAnnotationAttributes變量其實(shí)只有一個(gè)元素,僅僅是為了演示條件變量的使用,當(dāng)集合元素很多時(shí),使用條件斷點(diǎn)就能體會(huì)到它的方便之處)

問(wèn)題定位

通過(guò)Debug的方式深入條件注解的判斷邏輯(其中循環(huán)處可使用條件斷點(diǎn)),最終來(lái)到如下代碼片段

在這里是判斷來(lái)自所有屬性源配置的屬性中,是否包含條件注解指定的屬性,即spring.datasource.druid.druidServletSettings,由上圖可見(jiàn),spring.datasource.druid.druidServletSettings只是某些屬性的前綴,并不存在完全匹配的屬性,因此返回false,導(dǎo)致條件不滿(mǎn)足?;乜醋⒔釦ConditionOnProperty的javadoc,

* If the property is not contained in the {@link Environment} at all, the
* {@link #matchIfMissing()} attribute is consulted. By default missing attributes do not
* match.
* <p>
* This condition cannot be reliably used for matching collection properties. For example,
* in the following configuration, the condition matches if {@code spring.example.values}
* is present in the {@link Environment} but does not match if
* {@code spring.example.values[0]} is present.
*

當(dāng)Environment中不包含該屬性時(shí),則看matchIfMissing的值,該值默認(rèn)為false,如果包含該屬性,則再對(duì)比屬性值與havingValue的值,相等即滿(mǎn)足,不等則不滿(mǎn)足。并且該條件注解不能用于匹配集合類(lèi)型屬性。上述spring.datasource.druid.druidServletSettings實(shí)際上屬于一個(gè)Map類(lèi)型,因此不能想當(dāng)然地認(rèn)為該注解是只要屬性集中某屬性名稱(chēng)包含該值即滿(mǎn)足。

總結(jié)

當(dāng)難以定位到問(wèn)題原因時(shí),可以進(jìn)行Debug,跟蹤程序運(yùn)行的各個(gè)步驟,當(dāng)要在循環(huán)中Debug定位到某個(gè)元素時(shí),可以用條件斷點(diǎn)來(lái)實(shí)現(xiàn)。@ConditionalOnProperty注解不是存在某屬性就行,還需要值相等,并且不適用于集合類(lèi)型屬性。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java class文件格式總結(jié)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java class文件格式總結(jié)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java class文件格式總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-06-06
  • SpringBoot框架整合SwaggerUI的示例代碼

    SpringBoot框架整合SwaggerUI的示例代碼

    項(xiàng)目中使用了很多現(xiàn)成的框架,都是項(xiàng)目經(jīng)理、架構(gòu)師帶來(lái)的,從來(lái)沒(méi)有自己整合過(guò),今天給大家介紹下SpringBoot框架整合SwaggerUI的過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java JTable 實(shí)現(xiàn)日歷的示例

    Java JTable 實(shí)現(xiàn)日歷的示例

    這篇文章主要介紹了Java JTable 實(shí)現(xiàn)日歷的示例,幫助大家更好的理解和學(xué)習(xí)Java jtable的使用方法,感興趣的朋友可以了解下
    2020-10-10
  • 當(dāng)Transactional遇上synchronized的解決方法分享

    當(dāng)Transactional遇上synchronized的解決方法分享

    前些時(shí)間剛好刷到了有關(guān)于“# 【事務(wù)與鎖】當(dāng)Transactional遇上synchronized”這一類(lèi)的文章,感覺(jué)這也是工作中經(jīng)常會(huì)遇到的一類(lèi)問(wèn)題了。所以就針對(duì)這個(gè)話(huà)題進(jìn)行了分析并整理了常用的解決方法,希望對(duì)大家有所幫助
    2023-05-05
  • elasticsearch索引index之Mapping實(shí)現(xiàn)關(guān)系結(jié)構(gòu)示例

    elasticsearch索引index之Mapping實(shí)現(xiàn)關(guān)系結(jié)構(gòu)示例

    這篇文章主要介紹了elasticsearch索引index之Mapping實(shí)現(xiàn)關(guān)系結(jié)構(gòu)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • java實(shí)現(xiàn)銀行ATM管理系統(tǒng)

    java實(shí)現(xiàn)銀行ATM管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)銀行ATM管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java Collection 之List學(xué)習(xí)介紹

    java Collection 之List學(xué)習(xí)介紹

    本篇文章小編為大家介紹,java Collection 之List學(xué)習(xí)介紹。需要的朋友參考下
    2013-04-04
  • Java @SentinelResource全面介紹

    Java @SentinelResource全面介紹

    在實(shí)際應(yīng)用過(guò)程中,我們可能需要限流的層面不僅限于接口。可能對(duì)于某個(gè)方法的調(diào)用限流,對(duì)于某個(gè)外部資源的調(diào)用限流等都希望做到控制。對(duì)此,我們需要學(xué)習(xí)使用@SentinelResource注解,靈活的定義控制資源以及如何配置控制策略
    2022-08-08
  • 基于java中正則操作的方法總結(jié)

    基于java中正則操作的方法總結(jié)

    本篇文章介紹了,在java中正則操作的方法總結(jié)。需要的朋友參考下
    2013-05-05
  • 詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì)

    詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì)

    這篇文章主要介紹了Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì),是Java的GUI開(kāi)發(fā)中的基礎(chǔ)部分,需要的朋友可以參考下
    2015-10-10

最新評(píng)論