使用Spring在Java中动态加载属性

时间:2014-02-28 19:07:15

标签: java spring properties

在我的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上下文?

谢谢!

1 个答案:

答案 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

但是这有一个缺点,如果你有几个配置文件,它们将在文件路径中连接。