我有一個springboot應用程序,它使用spring集成在多個組件之間路由tcp消息,它在功能POV中正常工作。我卡上的屬性文件中聲明的常量試圖清理代碼,並取代多個硬編碼值(頻道名稱):在Spring中傳遞來自屬性文件的bean ID
實際的例子由幾個通道和路由器:
<int:channel id="input">
<int:channel id="outputA"/>
<int:channel id="outputB"/>
<int:channel id="outputC"/>
<int:router method="determineTargetChannel" input-channel="input">
<beans:bean class="MyRouter"/>
</int:router>
而且MyRouter類:
@Component
public class MyRouter {
@Router
public String determineTargetChannel(Object payload) {
if (condition1) {
return "outputA";
} else if (condition2) {
return "outputB";
} else return "outputC";
}
}
我沒有想有兩個地方硬編碼的通道標識,無論是在XML文件和Router類,以及(或者可以追究他們爲常量的任何其他類)。
所以我試過如下:
1)存儲的ID在屬性YML文件:
router:
channel:
outputA: outputA
outputB: outputB
outputC: outputC
2)更新XML文件:
<int:channel id="input">
<int:channel id="${router.channel.outputA}"/>
<int:channel id="${router.channel.outputB}"/>
<int:channel id="${router.channel.outputC}"/>
<int:router method="determineTargetChannel" input-channel="input">
<beans:bean class="MyRouter"/>
</int:router>
3)更新MyRouter等級:
@Component
public class DARouter {
@Value("${router.channel.outputA}")
private String outputA;
@Value("${router.channel.outputB}")
private String outputB;
@Value("${router.channel.outputC}")
private String outputC;
@Router
public String determineTargetChannel(Object payload) {
if (condition1) {
return outputA;
} else if (condition2) {
return outputB;
} else return outputC;
}
}
問題是,當Spring創建在XML文件中聲明的bean時,它不解析屬性值,所以它創建一個ID = $ {router.channel.outputA}而不是實際的bean值outputA。
它不是不加載屬性文件,因爲如果我試圖通過屬性到其他領域(不豆ID),它工作正常和值正確地注射,例如一個問題:
<int:router method="determineTargetChannel" input-channel="${router.channel.outputA}">
<beans:bean class="MyRouter"/>
</int:router>