@ConfigurationProperties与@Value的区别

@ConfigurationProperties与@Value的区别

1.松散语法

@ConfigurationProperties方式

用来测试的person类
@PropertySource加载指定的配置文件
@Component将person类注入到spring容器中
@Data lombok工具中的一个注解,用来生成一些相应的getter,setting,toString方法
@ConfigurationProperties进行properties文件绑定
@ConfigurationProperties与@Value的区别
测试类
@[email protected]@Test测试使用注解
@Autowired注入Bean
@ConfigurationProperties与@Value的区别
properties文件中的参数
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
通过lastName来测试
@ConfigurationProperties与@Value的区别
测试通过,说明@ConfigurationProperties支持松散语法

@Value方式

以下放一些关键性的图,重复的图就不再放了
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
都为last-name成功输出
此时我们将@Value中修改为lastName之后运行测试类
@ConfigurationProperties与@Value的区别
错文信息提示无法解析这个参数
@ConfigurationProperties与@Value的区别
故@Value的方式不支持松散语法

spel方面

@Value方式

@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
控制台输出结果为8,证明@Value这种方式是支持spring表达式语言的

@ConfigurationProperties方式

@ConfigurationProperties与@Value的区别
此时控制台输出数字格式异常@ConfigurationProperties与@Value的区别
证明:@ConfigurationProperties这种方式并不支持spring的表达式语言

JSR303数据校验

@ConfigurationProperties方式

首先将配置文件中的last-name删除
@ConfigurationProperties与@Value的区别
@Vllidated开启校验功能
给lastNmae贴上@Null校验判断,若为空则应该正常运行
@ConfigurationProperties与@Value的区别
结果正确
@ConfigurationProperties与@Value的区别
再将last-name在properoties文件中赋值
@ConfigurationProperties与@Value的区别

结果很明显,未通过@ConfigurationProperties与@Value的区别
由此说明,@ConfigurationProperties这种方式支持JSR303数据校验

接下来测试@Value的方式

我们先来取消注入测试一下
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
结果是通过了,故猜想,@Value方式也支持JSR303数据校验,但是我们还需要测试一下当数据注入后的运行结果
注入参数
@ConfigurationProperties与@Value的区别
测试
@ConfigurationProperties与@Value的区别
结果居然添加进去了,所以之前的猜想是错误的,结果说明@Value的方式并不支持JSR303数据校验

复杂类型的封装

@Value方式

我们这次测试两个类型,map和一个新的bean
@ConfigurationProperties与@Value的区别
用此方式获取配置文件中的map
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
以下是控制台打印结果
@ConfigurationProperties与@Value的区别
并没有获取到map的值,也没有获取到dog类中的信息
故此说明@Value的方式并不支持复杂类型数据的封装

@ConfigurationProperties方式

@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
@ConfigurationProperties与@Value的区别
此时可以顺利的获取到map中的值,并且也成功的获取到的dog类中封装的信息,故
@ConfigurationProperties方式支持复杂数据类型的封装

总结

@ConfigurationProperties与@Value的区别

若有什么错误还请指点,谢谢