SpringBoot注⼊数据的⽅式关于注⼊数据说明
1.不通过配置⽂件注⼊数据
通过@Value将外部的值动态注⼊到Bean中,使⽤的情况有:
注⼊普通字符串
注⼊操作系统属性
注⼊表达式结果
注⼊其他Bean属性:注⼊Student对象的属性name
注⼊⽂件资源
注⼊URL资源
辅助代码
package del;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component(value = "st")//对student进⾏实例化操作
public class Student {
@Value("悟空")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试@Value的代码
package del;
import org.springframework.beans.factory.annotation.Value;
import io.Resource;
import org.springframework.stereotype.Component;
@Component
public class SimpleObject {
@Value("注⼊普通字符串")
private String normal;
//关于属性的KEY可以查看System类说明
@Value("#{systemProperties['java.version']}")//-->使⽤了SpEL表达式    private String systemPropertiesName; // 注⼊操作系统属性
@Value("#{T(java.lang.Math).random()*80}")//获取随机数
private double randomNumber; //注⼊表达式结果
@Value("#{1+2}")
private double sum; //注⼊表达式结果 1+2的求和
@Value("classpath:os.yaml")
private Resource resourceFile; // 注⼊⽂件资源
resource和autowired注解的区别
@Value("www.baidu")
private Resource testUrl; // 注⼊URL资源
@Value("#{st.name}")
private String studentName;
//省略getter和setter⽅法
@Override
public String toString() {
return "SimpleObject{" +
"normal='" + normal + '\'' +
", systemPropertiesName='" + systemPropertiesName + '\'' +                ", randomNumber=" + randomNumber +
", sum=" + sum +
", resourceFile=" + resourceFile +
", testUrl=" + testUrl +
", studentName='" + studentName + '\'' +
'}';
}
}
Spring的测试代码
import del.SimpleObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import st.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo04BootApplicationTests {
@Autowired
private SimpleObject so;
@Test
public void contextLoads()  {
System.out.println(so);
}
}
运⾏结果为:SimpleObject{normal='注⼊普通字符串', systemPropertiesName='1.8.0_172', randomNumber=56.631954541947266, sum=3.0, resourceFile=class p
2.通过配置⽂件注⼊数据
通过@Value将外部配置⽂件的值动态注⼊到Bean中。配置⽂件主要有两类:
application.properties、application.yaml application.properties在spring boot启动时默认加载此⽂件
⾃定义属性⽂件。⾃定义属性⽂件通过@PropertySource加载。@PropertySource可以同时加载多个⽂件,也可以加载单个⽂件。
如果相同第⼀个属性⽂件和第⼆属性⽂件存在相同key,则最后⼀个属性⽂件⾥的key启作⽤。加载⽂件的路径也可以配置变量,如下⽂的${figinject},此值定义在第⼀个属性⽂件config.properties
在application.properties中加⼊如下测试代码
app.name=⼀步教育
在resources下⾯新建第⼀个属性⽂件config.properties内容如下
book.name=西游记
在resources下⾯新建第⼆个属性⽂件config_system.properties内容如下
我的⽬的是想system的值使⽤第⼀个属性⽂件中定义的值
book.name.author=吴承恩
下⾯通过@Value(“${app.name}”)语法将属性⽂件的值注⼊bean属性值,详细代码见:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import t.annotation.PropertySource;
import nv.Environment;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = {"classpath:config.properties","classpath:config_${figinject}.properties"}) public class LoadPropsTest {
@Value("${app.name}")
private String appName; // 这⾥的值来⾃application.properties,spring boot启动时默认加载此⽂件
@Value("${book.name}")
private String bookName; // 注⼊第⼀个配置外部⽂件属性
@Value("${book.name.author}")
private String author; // 注⼊第⼆个配置外部⽂件属性
@Autowired
private Environment env;  // 注⼊环境变量对象,存储注⼊的属性值
//省略getter和setter⽅法
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("bookName=").append(bookName).append("\r\n")
.append("author=").append(author).append("\r\n")
.append("appName=").append(appName).append("\r\n")
.append("env=").append(env).append("\r\n")
// 从eniroment中获取属性值
.append("env=").Property("book.name.author")).append("\r\n");
String();
}
}
测试代码
import del.SimpleObject;
import st.LoadPropsTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import st.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo04BootApplicationTests {
@Autowired
private LoadPropsTest lpt;
@Test
public void loadPropertiesTest()  {
System.out.println(lpt);
}
}
运⾏结果为:
bookName=西游记
author=吴承恩
appName=⼀步教育
env=StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[ConfigurationPropertySourcesPropertySource {name='configurationProp env=吴承恩
3. #{...}和${...}的区别演⽰
A.${…}的⽤法
{}⾥⾯的内容必须符合SpEL表达式,通过@Value(“${app.name}”)可以获取属性⽂件中对应的值,但是如果属性⽂件中没有这个属性,则会
报错。可以通过赋予默认值解决这个问题,如@Value("${app.name:胖先森}")
部分代码
// 如果属性⽂件没有app.name,则会报错
//  @Value("${app.name}")
//  private String name;
// 使⽤app.name设置值,如果不存在则使⽤默认值
@Value("${app.name:胖先森}")
private String name;
B.#{...}的⽤法
部分代码直接演⽰

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。