上一篇教程我们使用了application.properties和application.yml进行项目的配置,这篇博客将告诉你更多Spring Boot项目配置的方式
目录
二、@Value和@ConfigurationProperties比较
三、@PropertySource、@ImportResource、@bean
0.项目结构及代码
配置文件application.yml的内容如下:
student:
name: zg
is-female: false
birth: 2019/04/12
teachers: [zhang,wang]
grade: {English: 87, Math: 100}
pets:
spices: Dog
age: 1
Student.java代码如下,内容仅含成员变量,请自动生成toString()方法、get()方法和set()方法。
@Component
@ConfigurationProperties(prefix="student")
public class Student {
private String name;
private Boolean isFemale;
@Value("2014/3/12")
private Date birth;
private List<Object> teachers;
private Map<String, Object> grade;
private Pet pets;
}
Pet.java代码如下,内容仅含成员变量,请自动生成toString()方法、get()方法和set()方法。
public class Pet {
private String spices;
private Integer age;
}
主配置类Application.java是自动生成的代码如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
测试类ApplicationTests.java代码如下.
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Student student;
@Test
public void contextLoads() {
System.out.println(student);
}
}
1.使用@Value进行配置
1.1 简介
1、@Value用于将外部的值动态地注入Bean中,相当于使用.xml中的如下的代码。通常用于对某个值进行单个的注入,毕竟如果对整个Bean内的值进行注入我们有更好用的@ConfigurtionProperties可以使用。
<bean class="类名">
<property name="需要注入值的变量名" value="注入的值"></properties>
</bean>
2、我们可以点进去看一下@Value的源码,如下,我们发现它其中只包括一个String类型的变量,也就是说我们@Value注解后面只能接一个String类型的变量,无论什么内容都必须包括在双引号之下。
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
String value();
}
1.2 可注入类型
1.2.1 注入类型和注入方法
1、一共有7种可注入类型。字面量、数组(List)、键值对(Map)、其他bean属性、URL资源、文件资源、系统属性。可通过字符串或SpEL(Spring表达式语言,如计算表达式),也可以与配置文件一起配合使用。
(1)字符串:@Value("字符串内容")。适用于一般的自变量、数组、文件资源和URL资源,Spring Boot会根据配置的变量类型对字符串内容进行转换。
(2)SpEL:@Value("#{SpEL内容}")。通常SpEL内的字符串使用单引号''括起来。适用于需要计算的自变量、特殊数组、键值对、其他bean属性等。
(3)如果需要引入配置文件:${配置文件中的变量:默认值}.可以与字符串和SpEL进行组合,可设置默认值。如:
@Value("${web.blog:false}")
private Boolean blog;
在blog变量做值的注入,从配置文件中找是否有web.blog变量,如果没有,为其赋默认值false。
2、 接下来我将给出一些实例,方便进行理解。
首先我们构建一个新的bean,内容如下,请自动生成toString()方法、get()方法和set()方法。注意Resource的库文件的选择,有很多Resource,选择springframework的那个。
import org.springframework.core.io.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
public class Website {
//点击次数
private Integer clickNum;
//网站名称
private String webName;
//是不是博客
private Boolean blog;
//构建时间
private Date buildDate;
//构建的人
private String buildPerson;
//关键字
private List<String> key;
//其他属性
private Map<String,String> otherProperties;
//网址
private Resource address;
//介绍
private Resource intro;
}
然后我们修改一下ApplicationTests的内容,方便输出结果进行查看,执行的时候右键->Run就可以了。
public class ApplicationTests {
@Autowired
Website web;
@Test
public void contextLoads() {
System.out.println(web);
}
}
1.2.2 字面量:包括布尔、数值型、字符串等。
1、比较简单的使用@Value("字符串")即可。
@Value("true")
private Boolean blog;
2、可以通过SpEL注入,我们这里以整型的变量clickNum为例。代码和二者执行后的结果如下。
@Value("#{12*15}")
private Integer clickNum;
3、 可以通过@Value结合配置文件进行注入。配置文件可以使用".properties"和".yml",配置文件内容和注入方式如下所示。这里展示了使用配置文件的方式,所以之后如果非必要,我就不再展示这一部分的配置,并非无法使用。
#如果使用.properties文件配置
date=2011/6/11
#如果使用.yml进行配置
date: 2011/6/11
@Value("${date}")
private Date buildDate;