在 Spring 中,处理外部值有两种方式:
(1)使用 @PropertySource 注解和 Environment 类;
(2)使用 @Value 注解和属性占位符
一. 使用 @PropertySource 注解和 Environment 类
@Configuration
@ComponentScan("com.shenjy")
@PropertySource("classpath:/application.properties") //指定属性源
public class PlaceHolderConfig {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(env.getProperty("spring.datasource.url")); datasource.setUsername(env.getProperty("spring.datasource.username")); datasource.setPassword(env.getProperty("spring.datasource.password")); datasource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
return datasource;
}
}
如果需要注入非 String 类型的属性值,则可以使用 Environment 类的 getProperty() 方法的另一种重载方式,代码如下:
datasource.setTestWhileIdle(env.getProperty("spring.datasource.testWhileIdle", Boolean.class));
datasource.setInitialSize(env.getProperty("spring.datasource.initialSize", Integer.class));
二. 使用 @Value 注解和属性占位符
@Configuration
@ComponentScan("com.shenjy")
@PropertySource("classpath:/application.properties")
public class ValueConfig {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("#{T(java.lang.Integer).parseInt('${spring.datasource.initialSize}')}")
private int initialSize;
@Value("#{T(java.lang.Boolean).parseBoolean('${spring.datasource.testWhileIdle}')}")
private boolean testWhileIdle;
@Bean //声明其为Bean实例
@Primary //在同样的DataSource中,首先使用被标注的DataSource
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setTestWhileIdle(testWhileIdle);
return datasource;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfig() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(new ClassPathResource("application.properties"));
return configurer;
}
}
使用属性占位符时,需要手动添加 PropertySourcesPlaceholderConfigurer bean,它可以基于 Spring Environment 及其属性源来解析占位符。
当需要类型转换时,目前自己知道的就是通过 Spring 表达式语言进行类型转换,如果还有其他比较简单的方式,麻烦指教下。