2017-08-07 54 views
0

我有一個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> 

回答

2

這就是Spring如何工作的方式。 id只能靜態聲明。這就是'@ Bean'的Java配置如何基於方法名稱,我們不能從外部指定方法名稱。僅僅因爲它已經編譯好了。

您應該重新考慮您的設計以保持當前功能。

相關問題