在我的Java主编中,我有以下内容:
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
SpringConfig.java看起来像这样:
@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
@ComponentScan(basePackages = {"...", "..."})
@PropertySource("classpath:prod.properties")
public class SpringConfig {
@Autowired
private Environment env;
@Autowired
private DataSource dataSource;
@Bean
public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
return new PropertySourcesPlaceholderConfigurer();
}
@Configuration
static class DatabaseConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Value("${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Bean
public DataSource dataSource() {
DriverManagerDataSource source = new DriverManagerDataSource(jdbcUrl,
jdbcUsername, jdbcPassword);
source.setDriverClassName(jdbcDriverClassName);
return source;
}
}
问题是我希望部署最终JAR的人指定所有数据库属性,因此我不想将该属性文件保留在类路径上。
在开始解析所有Spring EL @Value字段之前,我有什么选择在运行时加载某些内容并将其注入Spring上下文?
谢谢!
答案 0 :(得分:0)
如果您想要读取类路径之外的文件,可以在file:
注释中使用classpath:
pseudourl而不是PropertySource
pseudourl,例如:
@PropertySource("file:/path/to/prod.properties")
这告诉spring文件is to be loaded as a URL, from the filesystem;然后你可以根据你的需要交换文件。如果你需要的是根据不同的环境加载不同的文件,你需要的是profiles。
配置文件允许您根据用于启动应用程序的配置文件加载bean。我所做的是根据运行的配置文件加载文件,使用路径中的替换:
@PropertySource("file:${user.home}/project/config.${spring.profiles.active:dev}.properties")
在这种情况下,我使用的占位符将解析配置文件(如果没有配置文件处于活动状态,则默认情况下将加载dev)。例如,如果prod配置文件处于活动状态,则文件路径将解析为:
/home/eldermael/project/config.prod.properties
如果没有找到个人资料,那么:
/home/eldermael/project/config.dev.properties
但是这有一个缺点,如果你有几个配置文件,它们将在文件路径中连接。