springboot使用@Value进行属性注入
目录
1介绍2springboot初体验3springboot集成jsp4springboot属性注入5springboot集成mybatis6springboot集成lombok7springboot集成logback日志8springboot开启全局热部署9springboot面向切面编程10springboot文件上传11springboot文件下载12springboot自定义拦截器13springboot打成war包发布14springboot打成jar包发布15springboot自定义banner16springboot配置文件拆分
基本属性注入
如何给组件里面的基本属性注入一个值呢?很简单,我们只要做到下面几步就可以了
- 在
application.yml
文件里面定义变量名称和值,变量名称最好和组件里面一样。例如name: niumowang
- 在
controller
里面定义一个name
变量,例如private String name;
- 在变量上面加上
@Value${变量名}
注解取application.yml
里面的值,例如@Value("${name}")
做到上面几步就可以把application.yml
里面的name
注入到controller
里面的name
了。
::: warning 注意
如果注入的变量名为username的时候,${username}
取到的值不是我们定义的值,而是默认取到我们计算机的名称,
所以我们要使用注解的方式传值的时候,变量名最好不要定义为username
:::
延申:我们再来看看java的基本类型、数组类型的例子,其实和String类型是一样的。
application.yml
文件如下所示
server:
port: 8088 # 配置端口
servlet:
context-path: /moyundong # 配置项目名称
name: niumowang
age: 18
uuid: 12345678901234
grade: 32.89
price: 18.8888
flag: true
names: 小明,xiaohong,小刚
TestController
文件如下所示
@RestController
@RequestMapping("Test")
public class TestController {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@Value("${uuid}")
private long uuid;
@Value("${grade}")
private float grade;
@Value("${price}")
private double price;
@Value("${flag}")
private boolean flag;
@Value("${names}")
private String[] names;
@RequestMapping("hello")
public String hello(){
System.out.println("name="+ name);
System.out.println("age="+ age);
System.out.println("uuid="+ uuid);
System.out.println("grade="+ grade);
System.out.println("price="+ price);
System.out.println("flag="+ flag);
for (String name : names) {
System.out.println("name="+ name);
}
return "hello springboot";
}
}
运行结果如下所示
name=niumowang
age=18
uuid=12345678901234
grade=32.89
price=18.8888
flag=true
name=小明
name=xiaohong
name=小刚
list和map注入
- list定义值的时候,和数组类似,但是注入值的时候使用
@Value("#{'${变量名}'.split(',')}")
- map定义值得时候用一个json格式得数据,例如
maps: "{'name1':'花花','name2':'小草'}"
,注入得时候用@Value("#{${maps}}")
application.yml
文件如下所示
strList: str1,str2,str3
maps: "{'name1':'花花','name2':'小草'}"
TestController
文件如下所示
@Value("#{'${strList}'.split(',')}")
private List<String> strList;
@Value("#{${maps}}")
private Map<String,String> maps;
大家可以自己运行看看结果。
静态变量注入
- 当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的
- 若要给静态变量赋值,可以使用set()方法
具体做法如下
person:
personName: niumowang
personAge: 18
TestController
文件如下所示
private static String personName;
private static int personAge;
@Value("${person.personName}")
public void setPersonName(String ame){
personName = ame;
}
@Value("${person.personAge}")
public void setPersonAge(int age){
personAge = age;
}
::: tip 提示application.yml
文件里面定义值得时候如果有父子关系,那么组件里面取值得时候直接父点子就行了,例如上例中
的person.personName
和 person.personAge
:::
对象注入
使用@ConfigurationProperties(prefix = "前缀")
的方式给一个对象注入值,不用给对象每个属性都注入一遍值。
当然,也可以给每个属性都注入,但是这样太麻烦了。具体怎么做的,看下面示例
在application.yml
文件里面定义一个user对象
user:
id: a123456
namea: niumowang
age: 18
birthday: 1998/01/01
创建一个User对象,加上注解@ConfigurationProperties(prefix = "user")
,这个里面的前缀user就是
application.yml`文件里面最前面的user,格式就是按照示例那样写,注意空格和缩进代码如下:
@ConfigurationProperties(prefix = "user")
@Component
public class User {
private String id;
private String namea;
private int age;
private Date birthday;
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", namea='" + namea + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
public User() {
}
public User(String id, String namea, int age, Date birthday) {
this.id = id;
this.namea = namea;
this.age = age;
this.birthday = birthday;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNamea() {
return namea;
}
public void setNamea(String namea) {
this.namea = namea;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
然后在TestController
文件里面注入User,测试user的值是否注入成功。
@Autowired
private User user;
......
......
System.out.println("user="+ user);
运行后结果如下:
user=User{id='a123456', namea='niumowang', age=18, birthday=Thu Jan 01 00:00:00 CST 1998}
延申:在实体类User上面加上@ConfigurationProperties(prefix = "user")
后,idea最上面有个警告
怎么样消除呢?我们点击右边的open documentation...
,在里面找如下的依赖并且加导pom文件
<!-- 自定义注入时构建元数据,可以让我们写对象的时候有提示信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
加上之后警告就消除了,并且提示我们重新启动下springboot应用。重新启动后,我们还有意外收获,那就是在application.yml
文件里面
写user的属性的时候,会有提示信息。