前边我们使用@ConfigurationProperties注解来给bean里边的属性赋值,我们在学习spring的时候其实也会有@Value来给每一个值赋值,如下是spring的xml写法
<bean class="Person"> <property name="username" value="张三(或从配置文件读取${key},或者#{key}SPEL获取)"></property> </bean>
用注解就是@Value
下面我们在bean里边,把@ConfigurationProperties注解注释掉,然后如下写代码
package com.zhanshen.domain; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; /** * * 将配置文件中的每一个值映射到bean里边,我们就需要一个注解 * @ConfigurationProerties 该注解就是springboot将配置文件中的值与该类所有属性相绑定 * 里边有一个prefix的值,就是要指明绑定那一个数据,这里边server 和 person要选一个,明显我们要绑定Person * 只有这个组件是容器中的组件,才能使用容器中的功能.所以我们再添加一个注解@Component */ @Component //@ConfigurationProperties(prefix = "person") public class Person { @Value("张三") private String username; @Value("#{12 * 2}") private Integer age; @Value("${person.birthday}") private Date birthday; private boolean boss; private Map<String, Object> maps; private List<Object> lists; private Dog dog; public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public boolean isBoss() { return boss; } public void setBoss(boolean boss) { this.boss = boss; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Object> getLists() { return lists; } public void setLists(List<Object> lists) { this.lists = lists; } @Override public String toString() { return "Person{" + "username='" + username + '\'' + ", age=" + age + ", birthday=" + birthday + ", boss=" + boss + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + '}'; } }
运行结果我们可以看到,前边的@Value的值都传进来了,可以自己制定也可以从配置文件读取,这里边的bool值应该是默认为false
我们来写一下这俩传值的对比
@ConfigurationProperties | @Value | |
功能 | 批量注入数据的值 | 一个一个指定数据的值 |
松散绑定 支持松散绑定, | 比如userName和user-name和user_name效果一样 | 不支持 |
spEL支持 | 不支持 | 支持 #{11 * 2}就可以直接算出数值 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
有关JSR303校验,比如我们限定某个值为邮箱格式,那么就是判断注入的值是否是邮箱,否则会报错,相关注解是@Validated和@Email
我们可以看到以下报错,要注入的必须要是邮箱类型才可以
其中有关复杂类型封装是他俩之前最大的区别,@Value只支持简单类型的封装
我们新建一个controller类
里边内容如下
package com.zhanshen.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${person.username}") private String name; @RequestMapping("/sayHello") public String sayHello() { return "hello" + name; } }
启动应用可以看到我们的hello 张三页面
但是不可以传复杂类型会报错