我正在开发一个Spring-MVC应用程序,我们准备在其中安装不同服务器上的应用程序。由于每个服务器都可以拥有自己的数据库相关配置,因此我们希望使用外部属性文件(war文件之外),该文件可以在项目启动时读取。我该如何处理? 为了使它生效,我已经将应用程序初始化代码移至Java,这样,就不需要我们以前进行的静态XML读取。 但是,我们不确定如何动态创建和添加属性文件,该文件至少具有这三个值(包含数据库名称,用户名和密码的JDBC URL)。所有表,其他数据将自动创建。
这是初始化应用的类:
WebConfig.java:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.ourapp.spring"})
@EnableTransactionManagement
@EnableCaching
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
@Bean
public ReloadableResourceBundleMessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("../resources/locale/messages.properties");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocaleChangeInterceptor localeInterceptor(){
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Bean
public MappingJackson2HttpMessageConverter converter() {
return new MappingJackson2HttpMessageConverter();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("../webapp/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Bean
public DoNotTruncateMyUrls doNotTruncate(){
return new DoNotTruncateMyUrls();
}
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
@Bean
@Qualifier("primary_tx")
public HibernateTransactionManager getPrimaryTransactionManager() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(sessionFactory().getObject());
return txName;
}
@Bean
@Qualifier("extended_tx")
public HibernateTransactionManager txName() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(getExtendedSessionFactory().getObject());
return txName;
}
@Bean
@Qualifier("sessionFactory_origin")
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig().primaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}
@Bean
@Qualifier("sessionFactory_extended")
public LocalSessionFactoryBean getExtendedSessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig_Extended().secondaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}
}
谢谢。 :-)
答案 0 :(得分:1)
您可能正在寻找的是个人档案(@Profile or @Conditional
)
第1步:创建个人资料。以下是产品概要文件的示例。同样,您可以为dev
和qa
import javax.activation.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jndi.JndiObjectFactoryBean;
@Configuration
@Profile("prod")
@PropertySource("classpath:/com/<SomePath>/app.properties")
public class ProductionProfileConfig {
@Autowired Environment env;
@Bean
public DataSource dataSource() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName(env.getProperty("dbName"));
jndiObjectFactoryBean.setResourceRef(true);
jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
return (DataSource) jndiObjectFactoryBean.getObject();
}
}
第2步激活个人资料
在确定哪些配置文件时,Spring会采用两个独立的属性 有效:
spring.profiles.active
和spring.profiles.default
。如果 设置spring.profiles.active,然后确定其值 配置文件处于活动状态。但是,如果未设置spring .profiles.active,则 Spring看起来是spring.profiles.default。如果两者都不 设置spring.profiles.active或spring.profiles.default,然后在 没有有效的配置文件,只有那些未定义为 在个人资料中创建
更新
如果文件位于打包的war之外,请使用PropertyConfigurator.configure(Loader.getResource(<your-file-path>));
。稍后,您可以简单地使用@Value or SPel
答案 1 :(得分:0)
您可以使用PropertySourcesPlaceholderConfigurer
创建一个像这样的
@Bean
public static PropertySourcesPlaceholderConfigurer devPropertyPlaceholderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations(new PathMatchingResourcePatternResolver().getResources("file:pathtToFile"));
configurer.setIgnoreUnresolvablePlaceholders(true);
return configurer;
}
例如,如果您编写文件:/ tmp / dev / *。properties。它将在/ tmp / dev下加载所有属性文件。
如果要基于不同的环境(开发,测试,生产)自定义它。那么您可以使用@Profile
并创建多个bean。
@Bean
@Profile("dev")
public static PropertySourcesPlaceholderConfigurer devPropertyPlaceholderConfigurer() throws IOException {
..... // give dev properties file path
}
@Bean
@Profile("testing")
public static PropertySourcesPlaceholderConfigurer testPropertyPlaceholderConfigurer() throws IOException {
.....// give test properties file path
}
@Bean
@Profile("prod")
public static PropertySourcesPlaceholderConfigurer prodPropertyPlaceholderConfigurer() throws IOException {
.....// give prod properties file path
}
答案 2 :(得分:0)
编写一个配置管理器,该管理器将基于属性文件的名称创建配置对象。例如,
Configuration config = ConfigurationManager.getConfig("dbConfig");
因此,现在您的配置对象将包含与db相关的所有属性。实例化配置对象时,将所有属性读入该对象。
假设您的属性文件包含以下字段:
user.name = "Tom"
user.password = "pass"
下次需要“ user.name”时,只需执行config.getString("user.name")