springboot使用@Value进行属性注入

目录

1介绍2springboot初体验3springboot集成jsp4springboot属性注入5springboot集成mybatis6springboot集成lombok7springboot集成logback日志8springboot开启全局热部署9springboot面向切面编程10springboot文件上传11springboot文件下载12springboot自定义拦截器13springboot打成war包发布14springboot打成jar包发布15springboot自定义banner16springboot配置文件拆分

基本属性注入

如何给组件里面的基本属性注入一个值呢?很简单,我们只要做到下面几步就可以了

  1. application.yml文件里面定义变量名称和值,变量名称最好和组件里面一样。例如name: niumowang
  2. controller里面定义一个name变量,例如private String name;
  3. 在变量上面加上@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注入

  1. list定义值的时候,和数组类似,但是注入值的时候使用@Value("#{'${变量名}'.split(',')}")
  2. 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;

大家可以自己运行看看结果。

静态变量注入

  1. 当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的
  2. 若要给静态变量赋值,可以使用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.personNameperson.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最上面有个警告

springboot 使用对象作为入参和反参 springboot 参数注入_spring boot


怎么样消除呢?我们点击右边的open documentation...,在里面找如下的依赖并且加导pom文件

<!-- 自定义注入时构建元数据,可以让我们写对象的时候有提示信息-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

加上之后警告就消除了,并且提示我们重新启动下springboot应用。重新启动后,我们还有意外收获,那就是在application.yml文件里面
写user的属性的时候,会有提示信息。

springboot 使用对象作为入参和反参 springboot 参数注入_java_02