bean是如何装载到Spring IOC容器的(基于Spring boot)

本文详细介绍了SpringBoot中如何通过yml和properties配置文件获取bean,包括实体类与配置文件的映射,以及使用@Value注解获取简单类型值的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先快速搭建一个web项目(基于spring boot)

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跟配置文件进行映射,那么我们一般采用前两种方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值