【发布时间】:2016-06-03 19:20:58
【问题描述】:
我正在使用 Spring MVC(和 Hibernate)开发一个应用程序,并且对配置问题感到有些困惑。有这么多设置和配置 Spring 应用程序的方法并没有让事情变得更简单,有时甚至在整个教程中混在一起......
我使用带有纯 Java 配置的 Spring 4,因此没有 XML 配置文件。应用程序的入口点是 AbstractAnnotationConfigDispatcherServletInitializer 的子类:
public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {
HibernateConfig.class,
ServiceConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {MvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
我们看到有 2 个根配置类,分别用于加载 Hibernate 和 Service 配置类,以及一个用于加载 Service config 类(实际上只是扫描 ~.service 包下的组件)。
HibernateConfig 是唯一需要 application.properties 文件中的属性的,因此该文件被读取为 PropertySource 并在类中使用如下:
package nl.drsklaus.activiteitensite.configuration;
//imports
@Configuration
@EnableTransactionManagement
@ComponentScan({"nl.mydomain.activiteitensite.dao"})
@PropertySource(value= {"classpath:application.properties"})
public class HibernateConfig {
@Autowired
private Environment environment;
@Bean
public LocalSessionFactoryBean sessionFactory() {
//code
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
//TODO connection pooling configuration
return properties;
}
}
如我们所见,属性在包含@PropertySource 注解的配置文件中使用。 但很有可能其他配置文件也需要访问 application.properties。此外,我计划在这个文件中定义更多属性,例如存储用户图像的目录。 Controller 方法中将需要此信息,因此我需要一种更全局的方式来访问 application.properties。
所以我的问题是:
- 注入的环境是否只允许访问属性文件 如果 @PropertyResource 在相同的配置中定义 班级?
- 当多个@Configuration 类需要访问时 application.properties,我们是否需要将@PropertyResources 添加到 所有这些(迫使我们重复属性文件的名称)
- 我们如何在没有控制器类的情况下访问属性文件 显式加载它,重复它的名字?
未来,可能会有多个版本的属性文件用于测试和实时部署。
【问题讨论】:
-
Environment不够全球化怎么办。所有@PropertySource注释都被解析并放入其中。您可以在任何地方访问Environment并访问所有加载的属性。所以简而言之,1.不,2不,3使用Environment。 -
感谢您的回答,这是否意味着我可以使用 @PropertySource 仅注释一个配置类,然后将 Environment 注入任何其他类?我认为为此目的使用额外的通用配置类也会更好,因为现在注释在 Hibernate 配置类上,但是当 application.properties 文件也将不包含与 Hibernate 相关的属性时,它不应该加载到Hibernate 专用配置类...
-
这取决于你,你如何以及在哪里放置注释,不管
Environment将包含它们全部。
标签: java spring spring-mvc