gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:15:43 25 4
gpt4 key购买 nike

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

包含 beans 声明的文件:

@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是最低必需文件,仅用于指定文件属性位置:

<?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,我将获得 hibernate 目录(和子目录)中所有 .properties 文件的总和。目录)等。也许我在这里夸大了问题,你觉得怎么样?

最佳答案

首先放弃 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 文件)。减少您的配置并为您提供开箱即用的良好自动配置。

关于java - 在 Spring 代码库配置中处理属性文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com