Spring Bean Factory XML — Dasel v3 查詢模式
<when_to_use>
當你需要查詢任何 Spring Bean XML 檔案 — applicationContext.xml、*_beans.xml、spring-context.xml 或任何 Spring ApplicationContext XML — 以進行 Bean 發現、依賴分析、JMS 接線、屬性注入稽核或跨 Bean 引用追蹤時,請載入此技能。
</when_to_use>
適用於 Spring Bean Factory XML 的 Dasel v3 選擇器模式。務必明確加上 -i xml 參數。
屬性前綴規則: Dasel 友好模式(預設)會為 XML 屬性加上 - 前綴。id 屬性變成 -id,class 變成 -class。文字內容則為 #text。
Bean 發現
# 所有 Bean ID
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.filter(has("-id")).map("-id")'
# 所有 Bean 類別
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.filter(has("-class")).map("-class")'
# 對每個 Bean 取 -class(包含沒有 -id 的 Bean)
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.map("-class")'
類別模式匹配
透過 -class 上的正則表達式篩選 Bean。
# 類別名稱包含 JmsTemplate 的 Bean
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.filter(-class ~ ".*JmsTemplate.*").map("-id")'
# 統計符合類別模式的 Bean 數量
cat beans.xml | dasel -i xml 'len(beans.bean.filter(-class ~ ".*Jms.*"))'
依賴注入分析
透過 property 子元素的 -ref 屬性來尋找參照其他 Bean 的 Bean。
模式: parentCollection.filter(childElement.filter(condition).len($this) > 0) — 透過檢查是否存在符合條件的子元素(長度大於 0)來篩選父層。
# 透過 ref 屬性參照特定 Bean ID 的 Bean
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.filter(property.filter(-ref == "targetBeanId").len($this) > 0).map("-id")'
JMS 目的地映射
透過 property 子元素來尋找哪些 Bean 使用了哪些 JMS 目的地。
# 連線到特定目的地屬性的 Bean
cat integrationpoint_beans.xml | dasel -i xml 'beans.bean.filter(property.filter(-name == "destination").len($this) > 0).map("-id")'
屬性注入提取
從 Bean 定義中提取外部化的 ${...} 佔位符值。
# 所有使用 ${...} 佔位符的屬性值
cat storage_beans.xml | dasel -i xml 'beans.bean.property.filter(-value ~ ".*\\$\\{.*\\}.*").map("-value")'
屬性與文字內容存取
# <bean id="myBean" class="com.example.Foo">some text</bean>
cat beans.xml | dasel -i xml 'beans.bean[0].-id' # myBean
cat beans.xml | dasel -i xml 'beans.bean[0].-class' # com.example.Foo
cat beans.xml | dasel -i xml 'beans.bean[0].#text' # some text
# 探查第一個 Bean 上的所有鍵(屬性 + 子元素)
cat beans.xml | dasel -i xml 'beans.bean[0].keys($this)'
命名空間處理
友好模式會從元素名稱中移除命名空間前綴 — 這對大多數 Spring 查詢已足夠。
當命名空間前綴導致選擇器失敗(元素明明存在卻找不到)時,請切換到結構模式:
cat spring-context.xml | dasel -i xml --read-flag xml-mode=structured 'beans.bean[0]'
跨檔案分析
將中間結果寫入 /tmp/ — 切勿寫入原始碼目錄。
# 從多個檔案提取 Bean ID 並進行比對
cat chaosrouter_beans.xml | dasel -i xml 'beans.bean.filter(has("-id")).map("-id")' > /tmp/chaosrouter_beans.txt
cat integrationpoint_beans.xml | dasel -i xml 'beans.bean.filter(has("-id")).map("-id")' > /tmp/integration_beans.txt
diff /tmp/chaosrouter_beans.txt /tmp/integration_beans.txt