2017-06-08 63 views
0

我正在開發服務的Java API,並且我想將它提取到庫中。 我使用春天4.3.3在上下文啓動之前提供外部Bean

現在有一個叫ApiConfig豆這是簡單的POJO。

public class ApiConfig { 
    private String host; 
    private String username; 
    private String password; 
} 

並且從屬性文件中讀取值。

我希望能夠在之前構建並提供此類上下文開始(幾個組件具有此類作爲@Autowired依賴關係)。

例如:

public class LoginService { 

    @Autowired 
    private ApiConfig apiConfig 

    [...] 
} 

基本上,我願做這樣的事情:

public static MyApi get(ApiConfig apiConfig) { 

    //Here I want to provide this apiConfig as singleton bean that would be used everywhere 
    provide somehow this class as bean 
    // here all beans are loaded and the it fails because it cannot resolve ApiConfig 
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ContextConfig.class); 
    MyApi myApi= context.getBean(MyApi.class); 
    return myApi; 
} 

的方法MyApi.get(AppConfig的)將加入依賴使用由其他Java應用程序在pom.xml

有沒有一種方法可以做到這一點?提供ApiConfig bean,然後初始化所有應用程序?

基本上可以讓Spring知道還有這個bean,從上下文中new AnnotationConfigApplicationContext(ContextConfig.class)

UPDATE

的想法會是這樣,在使用這個庫的任何應用程序之前。

public static void main(String asdas[]) { 
    ApiConfig config = new ApiConfig(); 
    config.setUsername("BOBTHEUSER"); 
    //config.set etc 
    MyApi api = MyApi.get(config); 
    api.doOperation(); 
+0

爲什麼之前創建使用@DependsOn註釋進行初始化?只要把它定爲一個普通的spring bean,只需要注入值。您不需要在應用程序上下文的範圍之外初始化它。 –

+0

已更新問題 – Manza

回答

0

實際上@Autowire就夠了。使ApiConfig成爲一個Bean,並在需要時自動裝載它。春天解決了正確的順序。

如果你有兩個豆類和一個需要第二

@Configuration 
public class MainConfig { 
    @Autowired 
    private ApiConfig apiConfig 

    @Bean(name="apiConfig") 
    public ApiConfig apiConfig(){ 
     ... init the config ... 
     return apiConfigInstance; 
    } 

    @Bean(name="myApi") 
    @DependsOn("apiConfig") 
    public MyApi myApi(){ 
     MyApi api = new MyApi(apiConfig); 
     return api; 
    } 
} 

the example代碼修改

+0

我無法在配置文件中對值進行硬編碼。這些值由外部來源提供 – Manza

+0

更新的問題 – Manza

+0

我甚至沒有提到配置文件。我的意思是配置類,您可以添加任何所需的邏輯 - 從文件讀取,從數據庫,從外部來源等。 – StanislavL

相關問題