春季:在外部添加属性文件

时间:2018-06-22 07:47:14

标签: java spring spring-mvc migration

我正在开发一个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;
    }

}

谢谢。 :-)

3 个答案:

答案 0 :(得分:1)

您可能正在寻找的是个人档案(@Profile or @Conditional

第1步:创建个人资料。以下是产品概要文件的示例。同样,您可以为devqa

创建一个
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.activespring.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")