代码之家  ›  专栏  ›  技术社区  ›  We are Borg

spring:外部添加特性文件

  •  0
  • We are Borg  · 技术社区  · 8 年前

    我正在开发一个spring mvc应用程序,我们正在准备在不同的服务器上设置应用程序。由于每台服务器都可以有自己的数据库相关配置,我们希望使用一个外部属性文件(在war文件之外),该文件可以在项目启动时读取。我该怎么做呢? 为了使它工作,我已经将应用程序初始化代码移动到Java,这样,静态XML读取就不再需要了。 但是,我们不确定如何动态地创建和添加一个属性文件,至少有3个值(包含DBD名称、用户名、密码)的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 回复  |  直到 8 年前
        1
  •  1
  •   Yati Sawhney    8 年前

    可能你要找的是个人资料( @Profile or @Conditional )

    步骤1: 创建配置文件。下面是prod profile的示例。类似地,您可以为 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();
        }
    }
    

    STEP2激活剖面

    在确定哪些配置文件时,spring遵循两个独立的属性 活跃: spring.profiles.active spring.profiles.default 。如果 设置spring.profiles.active,然后其值确定 配置文件处于活动状态。但是如果没有设置spring.profiles.active,那么 spring查找spring.profiles.default。如果两者都不是 spring.profiles.active或spring.profiles.default设置为,则 没有活动的配置文件,只有那些没有定义为 已创建在配置文件中

    更新

    使用 PropertyConfigurator.configure(Loader.getResource(<your-file-path>)); 如果文件位于打包的war之外。稍后您可以使用 @Value or SPel

        2
  •  0
  •   jbakirov    8 年前

    编写一个配置管理器,它将根据属性文件的名称创建配置对象。例如,

    Configuration config = ConfigurationManager.getConfig("dbConfig");

    所以,现在您的config对象将包含与db相关的所有属性。当您实例化配置对象时,请将所有属性读入该对象。

    假设您的属性文件包含以下字段:

    user.name = "Tom" user.password = "pass"

    下一次当你需要“用户名字”的时候,你会这样做。 config.getString("user.name")

        3
  •  0
  •   pvpkiran    8 年前

    你可以用 PropertySourcesPlaceholderConfigurer

    创建这样的bean

    @Bean
    public static PropertySourcesPlaceholderConfigurer devPropertyPlaceholderConfigurer() throws IOException {
       PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
       configurer.setLocations(new PathMatchingResourcePatternResolver().getResources("file:pathtToFile"));
       configurer.setIgnoreUnresolvablePlaceholders(true);
       return configurer;
    }
    

    例如,如果您编写了file:/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
    }