java - 建立依赖于应用程序位置的 Spring Bean

标签 java spring-mvc azure-cloud-services

我正在研究 Spring 的 Web MVC 实现。我在配置期间建立了一个代表数据库连接的 Bean。连接 Bean 使用一个 boolean 值进行初始化,该 boolean 值表示这是测试环境还是实时环境,它控制要连接到哪个相应的数据库。因此,我的配置包含类似以下内容:

@Bean
public ConnectionManager connectionManager() throws Exception{
    boolean isLive = true; /* This should be variable based on my environment */
    return new ConnectionManager (isLive);
}

我正在使用 Azure Toolkit for Eclipse 将此 Web 应用程序作为云服务部署到 microsoft azure 。我有两个独立的云应用程序,代表各自的测试和实时环境。

我的问题是我无法想到以编程方式确定它是否是实时环境。理想情况下,我能够从请求中提取基本 URI,并使用它来确定它,但该信息在配置时不可用。

也许我的方法完全错误。如有任何帮助,我们将不胜感激!

最佳答案

您的 Bean 不应该了解您的环境。这是糟糕的设计。如果 bean 使用完全相同的逻辑,您应该通过类路径 (src/main/resources) 上的 xxx.properties 文件注入(inject)连接属性,并且该文件在每个环境的代码分支中应该具有不同的值。因此,在您的存储库中,您将有一个“测试”分支和一个“实时”分支,其中两个 connection.properties 位于同一路径 src/main/resource 中,但它们具有不同的键/值对。这会将您的配置与实际代码分离。

像这样(来自 Spring 文档)

@Configuration
public class AppConfig {

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(url, username, password);
    }
} 

和 src/main/resources 中的 jdbc.properties 文件

#contents of jdbc.properties ( on 'test' branch )
jdbc.url=someHost.com/db
jdbc.username=root
jdbc.password=secret

#contents of jdbc.properties ( on 'live' branch )
jdbc.url=someHost.com/db_prod
jdbc.username=asdasdasda
jdbc.password=as3432543$$#@%@#

在 Spring 中管理属性有多种方法...我在下面提供了链接,演示了如何执行此操作:

http://www.summa-tech.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring

http://blog.jamesdbloom.com/UsingPropertySourceAndEnvironment.html

http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-injecting-property-values-into-configuration-beans/

关于java - 建立依赖于应用程序位置的 Spring Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192636/

相关文章:

java - 不想坚持一对一的实体

java - 在控制台显示一定数量的元素后添加一行

java - 使用 Spring 4 Java 配置配置 Jackson

azure - 在 Azure 中的同一云服务中托管 MVC 前端和 WebAPI 后端

java - .split ("|"中的运行时错误)

java - 通过bash运行Java应用程序的多个实例,如何访问其外壳菜单?

spring - 关于Spring MVC测试API的model()。attribute()方法的询问

ajax - Spring 3.2.4 中 @InitBinder 和 @RequestBody 转义 XSS

azure - 使用依赖于云服务的 ARM 模板部署自动缩放设置

Azure Webjob 与云服务中的虚拟机进行通信