2013-09-24 25 views
2

我使用註解的配置,而不是XML我的應用程序...非簧內獲取配置值託管Bean

@Configuration 
@ComponentScan(basePackages = { 
     "com.production" 
    }) 
@PropertySource(value= { 
     "classpath:/application.properties", 
     "classpath:/environment-${COMPANY_ENVIRONMENT}.properties" 
}) 
@EnableJpaRepositories("com.production.repository") 
@EnableTransactionManagement 
@EnableScheduling 
public class Config { 
    @Value("${db.url}") 
    String PROPERTY_DATABASE_URL; 
    @Value("${db.user}") 
    String PROPERTY_DATABASE_USER; 
    @Value("${db.password}") 
    String PROPERTY_DATABASE_PASSWORD; 

    @Value("${persistenceUnit.default}") 
    String PROPERTY_DEFAULT_PERSISTENCE_UNIT; 

在這個文件中,我發現我可以從配置值@PropertySource文件。我怎樣才能獲得春天管理bean以外的這些值?

我可以使用我的ApplicationContextProvider來獲取這些值嗎?

public class ApplicationContextProvider implements ApplicationContextAware { 
    private static ApplicationContext applicationContext; 

    public static ApplicationContext getApplicationContext() { 
     return applicationContext; 
    } 

    public void setApplicationContext (ApplicationContext applicationContext) { 
     this.applicationContext = applicationContext; 
    } 
} 

回答

3

如果我的理解正確,是的,您可以使用您的ApplicationContextProvider類。 @PropertySource屬性最終在ApplicationContextEnvironment。因此,您可以訪問他們像

public static class ApplicationContextProvider implements ApplicationContextAware { 
    private static ApplicationContext applicationContext; 

    public static ApplicationContext getApplicationContext() { 
     return applicationContext; 
    } 

    public void setApplicationContext (ApplicationContext applicationContext) { 
     this.applicationContext = applicationContext; 
     Environment env = applicationContext.getEnvironment(); 
     System.out.println(env.getProperty("db.user")); // access them 
    } 
} 

所以基本上任何地方,你必須將ApplicationContext一個參考,你可以得到一個@PropertySourcesPropertySourcesPlaceholderConfigurer聲明的屬性。

但是,在這種情況下,ApplicationContextProvider將不得不在您的上下文中聲明爲Spring bean。

@Bean 
public ApplicationContextProvider contextProvider() { 
    return new ApplicationContextProvider(); 
} 
+0

感謝您的回覆。爲什麼必須將其定義爲Spring bean?在我的應用程序中,我總是使用這種靜態。 – Webnet

+0

@Webnet它並不是必須的,但如果是這樣,Spring將負責調用和設置'ApplicationContext'。否則,您需要在完成初始化後自行調用它。 –