SpringBoot学习笔记(七)——属性绑定

1.使用value属性来获取properties中的属性值

我们可以使⽤@Value("${xxx}")的⽅式来获取properties中的属性值。
如果properties⽂件的名字是application.properties,那就不需要⽤@PropertySource注解,如果不
是,就需要@PropertySource("example.properties")

示例如下:

pom.xml中的代码和controller中和MyApplication中的代码不用改变。

Resources文件夹下增加一个application.properties的文件,代码如下:

username=rootuser
password=welcome

修改service的代码如下:

@Service
public class UserService {

    @Value("${username}")
    private String username;

    @Value("${password}")
    private String password;

    public String test() {
        return username+","+password;
    }
}

运行结果如下:

 

 username的值没有正确获取应该是系统变量导致的,我们将username这个变量名换成xingming再试一下:

 

 成功了。

2.修改application.properties的名称再尝试

在第一部分的基础上,我们修改application.properties的文件名为test.properties.

然后修改service类如下:

@Service
@PropertySource("test.properties")
public class UserService {

    @Value("${xingming}")
    private String username;

    @Value("${password}")
    private String password;

    public String test() {
        return username+","+password;
    }
}

防止@PropertySource("test.properties")被多次调用,我们可以直接在MyApplication类的开头添加这个注解,这样就不用在每一个用到属性值的类中引入了。

3.优化方案,也是最推荐的方式

在Spring Boot提供了⼀种更⽅便的⽅式来获取properties⽂件中的属性值。
⽐如我们⽤@Value,在UserService得写⼀遍所有的@Value,可能在其他Service也得写⼀遍。
所以我们可以在com.example中添加一个MyProperties.java文件,让这个文件与application.properties的属性进行一一对应,相当于这个Java文件就是这个属性集的bean类。
只需要在第一部分的基础上增加MyProperties.java和修改service类。
MyProperties代码如下:
这里@Component注解写上的原因是让MyApplication中配置的自动扫描能将这个类自动加入到bean容器中。

  @Component
public class MyProperties {
    
    @Value("${xingming}")
    private String xingming;

    @Value("${password}")
    private String password;

    public String getXingming() {
        return xingming;
    }

    public void setXingming(String xingming) {
        this.xingming = xingming;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

修改的service代码如下:

@Service
public class UserService {
    //@Value("${xingming}")
    //private String username;
    //@Value("${password}")
    //private String password;

    @Autowired
    private MyProperties myProperties;

    public String test() {
        return myProperties.getXingming()+","+myProperties.getPassword();
    }
}

4.优化:使用@ConfigurationProperties完成属性和变量的自动匹配,省略了@Value

 只需要在第三部分的基础上修改MyProperties.java类如下:

使用了@ConfigurationProperties省略@Value

@ConfigurationProperties
@Component
public class MyProperties {

    private String xingming;

    private String password;

    public String getXingming() {
        return xingming;
    }

    public void setXingming(String xingming) {
        this.xingming = xingming;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

5.补充@ConfigurationProperties注解匹配前缀的写法

 修改application.propertises的代码如下:

example.xingming=myuser
example.password=welcome

修改MyProperties.java代码如下:

会去掉前缀名与这个方法中的属性名自动匹配。

@ConfigurationProperties(prefix="example")
@Component
public class MyProperties {

    private String xingming;

    private String password;

    public String getXingming() {
        return xingming;
    }

    public void setXingming(String xingming) {
        this.xingming = xingming;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 6.两种代替在MyPropertise这个类上加@Component这个注解的方法

第一种:

在Spring Boot⾃身的源码中,通常不会在MyProperties上加@Component,⽽是在配置类上加上@EnableConfigurationProperties(MyProperties.class)。

代码如下:
@Configuration
@ConditionalOnClass(MyApplication.class)
@EnableConfigurationProperties(MyProperties.class)
public class AppConfig {

}
这样,就可以控制只有在符合指定的条件时,才会使得MyProperties成为Bean。

第二种:

另外还可以使⽤@ConfigurationPropertiesScan来进⾏扫描
@Configuration
@ConfigurationPropertiesScan("com.example.propertise")
public class AppConfig {

}
这样,照样可以是MyProperties⽣效,这种方式用于有多个properise的java类的情况下,就不用一个一个的配置了,直接整包扫描。
 
 
posted @ 2022-09-13 22:44  一直学习的程序小白  阅读(123)  评论(0编辑  收藏  举报