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类的情况下,就不用一个一个的配置了,直接整包扫描。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗