建立 Spring 个依赖于应用程序位置的 Bean
Establish Spring Bean that is dependent on application location
我正在研究 Spring 的 Web MVC 实现。我在配置期间建立了一个代表数据库连接的 Bean。连接 Bean 是用一个布尔值初始化的,表示这是测试环境还是实时环境,它控制要连接到哪个数据库。因此,我的配置包含如下内容:
@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。我有两个独立的云应用程序,代表各自的测试和实时环境。
我的问题是我无论如何也想不出以编程方式判断是否是live环境。理想情况下,我将能够从请求中提取基本 URI 并使用它来确定它,但该信息在配置时不可用。
也许我的方法完全错误。感谢您的帮助!
所以我想出了一个解决方案..它不是很优雅,但它有效。
我让我的 ConnectionManager class 可供控制器使用:
@Autowired
protected ConnectionManager manager;
我的解决方案是通过一种方法而不是直接访问连接管理器。该方法评估请求并决定是否需要更新管理器的环境。即:
@Autowired
private ConnectionManager manager;
@Autowired
private HttpServletRequest context;
/*
* Return an updated manager instance
*/
protected ConnectionManager getConnectionManager(){
/*
... Logic that evaluates the HttpServletRequest
... and changes the ConnectionManager accordingly.
*/
return manager;
}
这个逻辑存在于一个抽象控制器中 class 我的所有控制器都扩展了它。这使得所有控制器都可以轻松访问管理器的更新版本。
显然这并不完美,并且会为任何需要访问连接管理器的请求增加额外的开销,但我还没有找到任何替代方法。
您的 bean 不应该知道您的环境。这是糟糕的设计。如果 bean 使用完全相同的逻辑,您应该通过类路径 (src/main/resources) 上的 xxx.properties 文件注入连接属性,并且该文件在每个环境的代码分支中应该具有不同的值。因此,在您的存储库上,您将有一个 'test' 分支和一个 'live' 分支,其中两个 connection.properties 位于相同的路径 src/main/resource 但它们具有不同的 key/value 对.这将您的配置与实际代码分离。
所以像这样(来自 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);
}
}
和 jdbc.properties 文件 src/main/resources
#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
我正在研究 Spring 的 Web MVC 实现。我在配置期间建立了一个代表数据库连接的 Bean。连接 Bean 是用一个布尔值初始化的,表示这是测试环境还是实时环境,它控制要连接到哪个数据库。因此,我的配置包含如下内容:
@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。我有两个独立的云应用程序,代表各自的测试和实时环境。
我的问题是我无论如何也想不出以编程方式判断是否是live环境。理想情况下,我将能够从请求中提取基本 URI 并使用它来确定它,但该信息在配置时不可用。
也许我的方法完全错误。感谢您的帮助!
所以我想出了一个解决方案..它不是很优雅,但它有效。
我让我的 ConnectionManager class 可供控制器使用:
@Autowired
protected ConnectionManager manager;
我的解决方案是通过一种方法而不是直接访问连接管理器。该方法评估请求并决定是否需要更新管理器的环境。即:
@Autowired
private ConnectionManager manager;
@Autowired
private HttpServletRequest context;
/*
* Return an updated manager instance
*/
protected ConnectionManager getConnectionManager(){
/*
... Logic that evaluates the HttpServletRequest
... and changes the ConnectionManager accordingly.
*/
return manager;
}
这个逻辑存在于一个抽象控制器中 class 我的所有控制器都扩展了它。这使得所有控制器都可以轻松访问管理器的更新版本。
显然这并不完美,并且会为任何需要访问连接管理器的请求增加额外的开销,但我还没有找到任何替代方法。
您的 bean 不应该知道您的环境。这是糟糕的设计。如果 bean 使用完全相同的逻辑,您应该通过类路径 (src/main/resources) 上的 xxx.properties 文件注入连接属性,并且该文件在每个环境的代码分支中应该具有不同的值。因此,在您的存储库上,您将有一个 'test' 分支和一个 'live' 分支,其中两个 connection.properties 位于相同的路径 src/main/resource 但它们具有不同的 key/value 对.这将您的配置与实际代码分离。
所以像这样(来自 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);
}
}
和 jdbc.properties 文件 src/main/resources
#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