在Spring代码库配置中处理属性文件的正确方法

时间:2014-11-19 14:59:55

标签: java spring hibernate properties

我开始编写应用程序,我希望尽可能多地在java代码中包含spring配置。我遇到的问题是属性文件。看看我到目前为止所写的内容:

包含bean声明的文件:

@Configuration
@ImportResource("classpath:properties-configuration.xml")
public class ContextConfigutarion {

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

    @Value("${database.user}")
    private String database_user;

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

    @Value("${database.default.shema}")
    private String database_default_shema;

    @Bean
    public BasicDataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
        dataSource.setUrl(database_url);
        dataSource.setUsername(database_user);
        dataSource.setPassword(database_password);
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setHibernateProperties(hibernateProperties);  // <- here I encountered a problem 
        return sessionFactory;
    }
...
}

properties-configuration.xml它是最小的necessery文件,仅用于指定文件属性位置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:database.properties" />

</beans>   

当我开始配置sessionFactory对象时,我发现了一个问题。据我所知,在ContextConfiguration类中,我必须从database.properties文件中减去每个属性。如果我的应用程序有很多属性,那么我的配置java代码就会冗余增长。是不是有更好的方法将属性通过Spring传递给我的组件而不提取它们中的每一个。

第二个相关问题:在树状结构中保留应用程序属性有什么好方法?因为如上所示,应用程序属性包含:数据源属性,hibernate属性等,实际上是属性树。如果我的应用程序更大,并且有更多的组件保留树状结构的特性,那将是伟大的。我想象我有这样的属性存储在目录中:

/application
    /hibernate
        filename.properties
    /database
        filename.properties
    /someOddComponent
        /someStrangeComponent
            filename.properties
        filename.properties
    filename.properties

因此,如果我要求application.properties,我应该为应用程序目录(和子目录)中的所有.properties文件求和,如果我要求hibernate.properties,我将得到所有.properties文件的总和hibernate目录(和sub)目录)等等。也许在这里我夸大了问题,您怎么看?

1 个答案:

答案 0 :(得分:1)

首先丢弃xml文件并使用@PropertySource注释加载属性文件并在配置类中注册PropertySourcePlaceholderConfigurer

@Configuration
@PropertySource("classpath:database.properties")
public class ContextConfigutarion {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer ();
    }
}

如果您有很多属性而不是指定@Value注释,请使用Environment以及getPropertygetRequiredProperty方法。

@Configuration
@PropertySource("classpath:database.properties")
public class ContextConfigutarion {

    @Autowired
    private Environment env;

    @Bean
    public BasicDataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
        dataSource.setUrl(env.getRequiredProperty("database.url"));
        dataSource.setUsername(env.getRequiredProperty("database.user));
        // Other properties
        return dataSource;
    }

}

您不希望拥有大量配置文件,因为这只会使事情变得复杂且无法维护。将它们限制在一定数量。如果你想要一个类似系统的树,请不要使用属性文件,而是使用yaml文件。虽然加载有点困难(@PropertySource不支持),但这允许在单个文件中使用树状配置结构。

或者更好的是让Spring Boot为您处理复杂性(它支持开箱即用的属性和yaml文件)。减少您的配置,并为您提供开箱即用的自动配置。