SpringBoot 中读取应用配置&按各种条件装配

注:前期学习时的有道云笔记,后期翻看时觉得又是一番滋味,分享出来给大家,如有错误欢迎支出,并请大家谅解!感谢

1.读取应用配置

1.1Environment

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 使用更佳

1.2 @Value

在spring 管理大部分范围内即可使用,支持SpEL表达式

@Value("${server.port}")
public Integer serverPort;

注意:@Value 并不是所有的Spring 管理范围内都能使用,是由于它的实现机制决定的,它是AutowiredAnnotationBeanPostProcessor 实现的,它是BeanPostProcessor 接口的实现类,所以在任何BeanPostProcessor 和BeanFactoryPostProcessor 的子类中都不能使用@Value 注入属性,因为那时@Value 还未被处理

1.3@ConfigurationProperties

通常将一组同样类型的配置属性映射为一个类更为方便
比如

com.foo.name=caisebei
com.foo.age=24

在类中可以使用如下:

@Configuration
@ConfigurationProperties("com.foo")
public class Foo {
	private String name;
	private Integer age;

	//getter & setter
}

使用@ConfigurationProperties 注解 的时候会自动将“-” 、“_” 去掉,按照驼峰处理

1.4 Spring xml 中加载properties 配置方式

 <context:property-placeholder location="classpath:redis-key.properties"/>
 
 <util:properties id="propertyConfigurer"  local-override="true" location="classpath:jdbc.properties"/>

———————————————假装有条分割线—————————————————

2自动装配

2.1@Configuration

spring 使用java 类装载bean 的核心就是 ,并在此类中使用@Bean 不再多说(如果需要请百度 or 谷歌哈)

2.2条件装配

2.2.1 @ConditionalOnBean & @ConditionalOnMissingBean

@Configuration
@ConditionalOnBean(DataSource.class)
// FooConfig 生效的前提是上下文中已经配置了DataSouce
public class FooConfig{
	
	@Bean
	@ConditionalOnMissingBean
	//上下文中没有配置Myserver 时此配置bean 才会生效
	public Myserver myServer(){...} 
}

2.2.2 Class 条件装配

@ConditionalOnClass, class 条件装配是按照某个类是否在classpath 中来决定,是否要配置Bean

@Configuration
@ConditionalOnClass(Jedis.class)
public class JedisConfig{
.....
}

2.2.3 Environment 装配

根据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;

2.2.4 其他条件装配

@ConditionalOnExpression, 当表达式为true 时,才会实例化一个Bean,支持SpEL
@ConditionalOnjava,当存在指定的java 版本的时候
@ConditionalOnJava(range=Range.EQUAL_OR_NEWER,value=JavaVersion.EIGHT)

2.2.5 联合多个条件装配

组合如上条件装配使用

你可能感兴趣的:(SpringBoot)