spirng framework源码解析之spring-core-环境篇(九)

151 阅读2分钟

这是我参与8月更文挑战的第九天,活动详情查看:8月更文挑战

直接贴图

Environment.png

由上图我们直接可以得知,原理就是读取配置文件,从而获取我们平时需要的值,顶级接口定义PropertyResolver如下

// perperty 文件解析接口
public interface PropertyResolver {

        // 是否包涵指定key
	boolean containsProperty(String key);

        // 根据指定key获取对应的value,这里的注解不在该文章中描述,可关注笔者,后续会一一讲解
	@Nullable
	String getProperty(String key);

        // 根据指定key获取对应的value,若不存在,返回默认值
	String getProperty(String key, String defaultValue);

        // 根据指定key获取对应的value
	@Nullable
	<T> T getProperty(String key, Class<T> targetType);

	// 根据指定key获取对应的value,若不存在,返回默认值
	<T> T getProperty(String key, Class<T> targetType, T defaultValue);

	// 根据指定key获取对应的value,若不存在,抛出 IllegalStateException 异常
	String getRequiredProperty(String key) throws IllegalStateException;

	// 根据指定key获取对应的value,若不存在,抛出 IllegalStateException 异常
	<T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException;

	// 解决${…}占位符,将它们替换为getProperty解析的相应属性值。没有默认值的不可解析占位符将被忽略并不变地传递。
	String resolvePlaceholders(String text);

	// 解决${…}占位符,将它们替换为getProperty解析的相应属性值。没有默认值的不可解析占位符将被忽略并不变地传递。 如果参数text为null,抛出 IllegalArgumentException 异常
	String resolveRequiredPlaceholders(String text) throws IllegalArgumentException;

ok,我们再看看PropertyResolver的子接口Environment它又定义了哪些方法

// 表示当前应用程序运行的环境相关的信息
public interface Environment extends PropertyResolver {

	// 返回此环境中显式激活的配置文件集, ConfigurableEnvironment#setActiveProfiles(String...)
        // 简单来说就是 --spring.profiles.active对应的值
	String[] getActiveProfiles();

         // 返回此环境中默认的配置文件集,ConfigurableEnvironment#setActiveProfiles
         // 就是 --spring.profiles.default 对应的值
	String[] getDefaultProfiles();

        // 该注解表明已弃用,直接跳过
	@Deprecated
	boolean acceptsProfiles(String... profiles);

        // 判断是否为激活的
	boolean acceptsProfiles(Profiles profiles);

继续,我们来看看解析参数的类SimpleCommandLinePropertySource

public class SimpleCommandLinePropertySource extends CommandLinePropertySource<CommandLineArgs> {}

具体用法官方也给出了说明示例,以及使用场景

   public static void main(String[] args) {
       PropertySource<?> ps = new SimpleCommandLinePropertySource(args);
       // ...
   }