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 工厂 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。
模式: 父集合.filter(子元素.filter(条件).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