Spring boot是如何将bean装载进IOC容器的呢?
方法一:yml配置文件获取
编写application.yml配置文件
person:
id: 1
name: jack
birthday: 2019/2/1
maps: {K1: v1,k2: v2}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
创建一个Person(实体类)
/**
* @ConfigurationProperties告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定
* prefix = "person" :配置文件中哪个下面的所有属性进行一一映射
* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值
*
*/
@Component //托管到ioc容器中
@ConfigurationProperties(prefix = "person")
public class Person {
private Long id;
private String name;
private Date birthday;
private Map<String,Object> maps;
private Dog dog;
private List<Object> list;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", birthday=" + birthday +
", maps=" + maps +
", dog=" + dog +
", list=" + list +
'}';
}
}
@ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值 ,但是如果将所有的配置信息放在全局配置文件中势必会造成全局配置文件过于复杂,所以我们可以自己创建配置文件(比如创建person1.yml,把配置信息放到这个文件里),然后添加这个@PropertySource(value = {"classpath:person1.yml"})注解,便能从指定路径读取配置文件
创建一个Dog实体类
public class Dog {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在pom.xml添加相关依赖
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
接着在主程序获取bean
@SpringBootApplication
public class OracleApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(OracleApplication.class, args);
Person bean = ctx.getBean(Person.class);
System.out.println(bean);
}
}
方法二:application.properties配置文件获取
先将上面在application.yml配置的内容注释掉。
再编写application.properties配置文件
#person
#idea默认使用utf-8进行编码
person.id=17
person.name=zp
person.birthday=1998/06/28
person.maps.k1=v1
person.maps.k2=v2
person.list=1,2,3
person.dog.name=小狗
person.dog.age=23
其他步骤方法一,也一样能获得bean.不管是yml还是properties他们都能获取到值
方法三:使用@Value获取值
@ConfigurationProperties(prefix = "person")
@Component
public class cat {
@Value("小猫咪")
private String name;
@Value("#{1+2}")
private String age;
@Value("${person.name}")
private String master;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
@Override
public String toString() {
return "cat{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", master='" + master + '\'' +
'}';
}
这种获取值的方法比较局限,只能获取一些比较简单的数据类型,对于比较复杂的类型,比如map,list,对象类型是获取不到的,所以如果说我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。如果我们已经编一写了一个javaBean跟配置文件进行映射,那么我们一般采用前两种方法。