注:前期学习时的有道云笔记,后期翻看时觉得又是一番滋味,分享出来给大家,如有错误欢迎支出,并请大家谅解!感谢
Environment 通用的配置读取类,可以读取application.properties, application.yml ,命令行输入参数、系统属性、操作系统环境变量,可以通过Spring 容器自动注入,可以使用如下:
@Configuration
public class EnvConfig{
@Autowired
private Environment env
public int getProperties(){
return env.getProperty("com.foo", Integer.class);
}
}
Environment 是SpringBoot 最早初始化的一个类,因此可以使用在Sring 的任何地方,结合Spring 中org.springframework.context.EnvironmentAware 使用更佳
在spring 管理大部分范围内即可使用,支持SpEL表达式
@Value("${server.port}")
public Integer serverPort;
注意:@Value 并不是所有的Spring 管理范围内都能使用,是由于它的实现机制决定的,它是AutowiredAnnotationBeanPostProcessor 实现的,它是BeanPostProcessor 接口的实现类,所以在任何BeanPostProcessor 和BeanFactoryPostProcessor 的子类中都不能使用@Value 注入属性,因为那时@Value 还未被处理
通常将一组同样类型的配置属性映射为一个类更为方便
比如
com.foo.name=caisebei
com.foo.age=24
在类中可以使用如下:
@Configuration
@ConfigurationProperties("com.foo")
public class Foo {
private String name;
private Integer age;
//getter & setter
}
使用@ConfigurationProperties 注解类 的时候会自动将“-” 、“_” 去掉,按照驼峰处理
<context:property-placeholder location="classpath:redis-key.properties"/>
<util:properties id="propertyConfigurer" local-override="true" location="classpath:jdbc.properties"/>
———————————————假装有条分割线—————————————————
spring 使用java 类装载bean 的核心就是 ,并在此类中使用@Bean 不再多说(如果需要请百度 or 谷歌哈)
@Configuration
@ConditionalOnBean(DataSource.class)
// FooConfig 生效的前提是上下文中已经配置了DataSouce
public class FooConfig{
@Bean
@ConditionalOnMissingBean
//上下文中没有配置Myserver 时此配置bean 才会生效
public Myserver myServer(){...}
}
@ConditionalOnClass, class 条件装配是按照某个类是否在classpath 中来决定,是否要配置Bean
@Configuration
@ConditionalOnClass(Jedis.class)
public class JedisConfig{
.....
}
根据Environment 中的属性来决定是否生效
@ConditionalOnProperty(name="com.foo.enabled", havingValue="true", matchIfMissing=true)
public class MessageCenterAutoConfiguration{}
根据com.foo.enabled 与 havingValue 值比较是否生效,如果没有指定havingValue ,只要属性不为false ,配置都生效。
matchIfMissing 为true 以为这如果Environment 没有包含“com.foo.enabled” ,配置也能生效,默认为false;
@ConditionalOnExpression, 当表达式为true 时,才会实例化一个Bean,支持SpEL
@ConditionalOnjava,当存在指定的java 版本的时候
@ConditionalOnJava(range=Range.EQUAL_OR_NEWER,value=JavaVersion.EIGHT)
组合如上条件装配使用