Properties配置文件注入
如果我们还在使用相对较老的Properties文件的方式,存放我们项目的配置信息,那么我们可以通过*@PropertySource*注解、配置@Value的方式读取我们resource目录下的配置文件;
yaml
//applicaiton.properties配置
spring.redis.host: 127.0.0.1
spring.redis.port: 3306
spring.redis.password :123456
kotlin
@Component
@PropertySources(value = "classpath:application.properties")
public class RedisProperties {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private int password;
}
如果不想写@Value注解,可以在类头加@ConfigurationProperties(prefix = "spring.redis")注解;
不同环境文件的读取
Spring boot项目是优先读取 application.yml 或者 application.properties,profile机制会根据不同环境读取不同的配置文件
ini
//需要我们在applicaiton.properties设置环境变量
spring.profiles.actives = dev
Yml的方式注入
如果使用yml的方式配置文件,如何实现动态注入呢?
yaml
//application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
password: password
YamlPropertiesFactoryBean类读取
可以采用Spring beans包下对yml文件配置读取的类,YamlPropertiesFactoryBean,还有一个YamlMapFactoryBean返回map集合类型的配置;
csharp
@GetMapping("getRedisConfig")
public Properties getRedisConfig(){
YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();
yamlProFb.setResources(new ClassPathResource("redis-file.yml"));
Properties properties = yamlProFb.getObject();
System.out.println(properties.get("redis.host"));
System.out.println(properties.get("redis.port"));
System.out.println(properties.toString());
return properties;
}
PropertySourcesPlaceholderConfigurer
也可以采用PropertySourcesPlaceholderConfigurer自定义配置类,使用该类进入属性注入,这个类主要解决的是YamlPropertiesFactoryBean只限于在一个接口使用,如果在定义一个接口不用YamlPropertiesFactoryBean去加载配置类,是无法读取的; 所以我们用PropertySourcesPlaceholderConfigurer,该类是实现Aware接口,而最根本还是调BeanFactoryPostProcessor,bean工厂的后置处理器;
所以我们这么配置,就可以实现全局的配置文件属性读取;
java
@Configuration
public class YmlRedisConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer yamlConfigurer(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("redis-file.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
Environment实现属性动态注入
Spring boot在启动的时候,会构建一个org.springframework.core.env.Environment对象,用于存储配置类; 根据下图,我们可以看到最终都会去实现PropertyResolver接口;
[image:2C39516B-C70F-485E-9F88-A4A7CA7F4292-2581-00001ED1E5808FF4/4CE2B56C-5B64-4756-B38A-18BA819200E1.png]
java
@Autowired
private Environment env;
@Bean
public DataSource dataSource() throws PropertyVetoException, SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("mysql.connection.url"));
dataSource.setUsername(env.getProperty("mysql.connection.username"));
dataSource.setPassword(env.getProperty("mysql.connection.password"));
return dataSource;
}
输入、输出流原生态注入
InputStreamReader字节流读取application.propertie,Properties.load()方法 进行读取;
java
@Bean
public Properties initRedisConfig() throws IOException {
Properties properties =new Properties();
InputStreamReader inputStreamReader =new InputStreamReader(
this.getClass().getResourceAsStream("application.properties"), StandardCharsets.UTF_8);
properties.load(inputStreamReader);
return properties;
}