首页   快速返回

spring5属性及内嵌属性解析     所属分类 spring
application.properties

hellomsg=hello,${name}
name=tiger
age=9


AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(Config.class);
		ctx.refresh();
		
		// hellomsg=hello,${name}
		// name=tiger
		// age=9
				
		Environment env = ctx.getEnvironment();
		
		String name = env.getProperty("name");
		String hellomsg = env.getProperty("hellomsg");
		int age = env.getProperty("age", Integer.class);
		
		System.out.println("name="+name);
		// PropertySourcesPropertyResolver  
		System.out.println("hellomsg="+hellomsg);
		System.out.println("age="+age);
		
		// 使用反射获取 AbstractEnvironment 的 propertyResolver 字段
		PropertySourcesPropertyResolver propertyResolver = getPropertySourcesPropertyResolver(env);		
		System.out.println(propertyResolver);
		// 使用反射调用 PropertySourcesPropertyResolver 里的protected方法 getPropertyAsRawString
		String hellomsgRaw = getPropertyAsRawString("hellomsg",propertyResolver);
		System.out.println("hellomsgRaw="+hellomsgRaw);

输出结果

name=tiger
hellomsg=hello,tiger
age=9
hellomsgRaw=hello,${name}


PropertySourcesPropertyResolver

protected String getPropertyAsRawString(String key) {
		return getProperty(key, String.class, false);
	}

protected  T getProperty(String key, Class targetValueType, boolean resolveNestedPlaceholders)


resolveNestedPlaceholders 是否解析 内嵌属性
hellomsgRaw=hello,${name}


Object value = propertySource.getProperty(key);
if (value != null) {
		if (resolveNestedPlaceholders && value instanceof String) {
			value = resolveNestedPlaceholders((String) value);
		}
}


一些异常情况测试

        try{
		    propertyResolver.getRequiredProperty("propNotExist");
		}catch(Throwable e){
			// java.lang.IllegalStateException: Required key 'propNotExist' not found
			System.out.println(e);
		}
		
        try{
        	propertyResolver.getProperty("name", Integer.class);
        }catch(Throwable e){
			// org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value 'tiger'; nested exception is java.lang.NumberFormatException: For input string: "tiger"
			System.out.println(e);
		}	




属性循环引用测试

msg1=msg1-hello,${msg2}
msg2=msg2-hello,${msg1}


String msg1 = env.getProperty("msg1");

java.lang.IllegalArgumentException: Circular placeholder reference 'msg2' in property definitions




private static PropertySourcesPropertyResolver getPropertySourcesPropertyResolver(Environment env)throws Exception{ // 获取 public 字段 (包含父类) // Field field = env.getClass().getField("propertyResolver"); // 获取本类的所有字段 (不包含父类的字段) // Field field = env.getClass().getDeclaredField("propertyResolver"); // env StandardEnvironment // AbstractEnvironment 包含 propertyResolver 字段 Field field = env.getClass().getSuperclass().getDeclaredField("propertyResolver"); field.setAccessible(true); return (PropertySourcesPropertyResolver)field.get(env); } private static String getPropertyAsRawString(String key,PropertySourcesPropertyResolver propertyResolver)throws Exception{ Method method = PropertySourcesPropertyResolver.class.getDeclaredMethod("getPropertyAsRawString", new Class[]{String.class}); method.setAccessible(true); return (String)method.invoke(propertyResolver, key); }

上一篇     下一篇
spring5自动装配实例

eclipse异常断点设置

eclipse设置条件断点和异常断点

反射获取字段注意点

这样的人你敢要吗

我们怎么了