SpingBoot之配置文件的值注入问题

我们在这里研究的是以yml配置文件值注入的问题:

Person:
    lastName: 张三
    age: 23
    boss: false
    birth: 2018-10-11
    maps: {k1: v1,k2: v2}
    lists:
      - pig
      - dog
    dog:
      name: 半半
      age: 1

定义了一个Person的实体类:

package com.example.demo.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 将配置文件中配置的属性值映射到组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix = "person" 配置文件中哪些下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件才能使用容器提供的@ConfigurationProperties的功能
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    @Override
    public String toString() {
        return "Person{" +
                "lastName=‘" + lastName + ‘\‘‘ +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                ‘}‘;
    }

再定义一个dog的实体类

package com.example.demo.entity;
public class Dog {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + 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;
    }
}
set/get方法......

再定义一个测试类:

package com.example.demo;
import com.example.demo.entity.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * springBoot测试
 * 可以在测试期间可以很方便的类似编码一样进行自动注入等容器的功能
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    Person person;
    @Test
    public void contextLoads() {
        System.out.println(person);
    }
}

测试结果:

重点:

2、@Value获取值和@ConfigurationProperties获取值比较

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

所以我们也可以利用@Value()进行赋值:

@Componentpublic class Person {
   //lastName必须是邮箱格式@Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
   @Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

在配置文件值注入的时候进行数据校验:

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
   //lastName必须是邮箱格式
    @Email
    private String lastName;
    private Integer age;private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;    private Boolean boss;

3、@PropertySource&@ImportResource&@Bean

@PropertySource:加载指定的配置文件,将配置文件中配置的每一个属性的值,映射到这个组件中
@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,
prefix = "person":配置文件中哪个下面的所有属性进行一一映射只有这个组件是容器中的组件,才能

容器提供的@ConfigurationProperties功能,@ConfigurationProperties(prefix = "person")默认从全局

配置文件中获取值。

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;}set/get方法.....

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

1、配置类@Configuration

2、使用@Bean给容器中添加组件

@Configuration
public class MyAppConfig {
    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloServicfun(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}

原文地址:https://www.cnblogs.com/xyzmy/p/9775387.html

时间: 2024-10-14 13:01:46

SpingBoot之配置文件的值注入问题的相关文章

3.springboot:springboot配置文件(配置文件、YAML、属性文件值注入&lt;@Value、@ConfigurationProperties、@PropertySource,@ImportResource、@Bean&gt;)

1.配置文件: springboot默认使用一个全局配置文件 配置文件名是固定的 配置文件有两种(开头均是application,主要是文件的后缀): ->application.properties ->application.yml 作用:修改springboot自动配置的默认值 springboot在底层把一切都自动配好 位置: 配置文件放在src/main/resourcr目录或者 类路径/config 下 2.YAML: YAML(YAML Ain't Markup Language

spring框架IOC设值注入

spring以动态的形式来管理对象,注入分为两种: 1. 设置注入:直观  自然 2.构造注入:可以在构造器中决定依赖顺序 以下就是示例: 1.User实体类 package com.domain; import java.io.Serializable; /** * * @author Mr * 实体类 */ public class User implements Serializable { private Integer id; private String uname; private

Spring接口编程_设值注入和构造注入

说明: UserManagerImp是设值注入,UserManagerImp2是构造注入 接口不注入,也就是在Spring配置文件中没有接口的<bean>,但是定义的时候是用接口 private IUserDao userDao; IUserManager userManager2=(IUserManager) factory.getBean("userManager2"); 类都注入,①UserManagerImp和UserManagerImp2属于实现类 ②UserDa

依赖注入的实现方式:设值注入和构造方法注入

SSH开发时,一般将项目分成3层:web层.service层和dao层.开发的基本流程是先定义dao接口,然后实现该接口,在定义同类型的service接口,再实现service接口(此时使用dao接口注入),接着再从web层去调用service层. dao层完成的是底层的数据库操作,service层则完成纯粹的业务逻辑,该层中的数据操作部分是通过注入的dao层来实现的.service层的作用是将从dao层取得的数据做更贴近业务的实现,dao层则只实现对数据的增.删.改.查操作.使用这种分层方式更

SpringFramework|@Qualifier 设值注入&amp;构造注入

@Qualifier 设值注入&构造注入 前述 Java: 1.8 Maven: 3 SpringFramework版本以及各组件成员: 5.1.1.RELEASE spring-context spring-core spring-beans 可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱. 示例(

尚硅谷springboot学习9-配置文件值注入

首先让我想到的是spring的依赖注入,这里我们可以将yaml或者properties配置文件中的值注入到java bean中 配置文件 person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: 小狗 age: 12 javaBean: package com.atguigu.springboot.bean; impo

【Spring】Spring依赖注入IOC的设值注入setter

其实标题中如此高大上的名词,只是一个问题,关于在Spring的applicationContext.xml中的如下语句是什么意思? <property name="aService" ref="aService"/> 这类语句在SSH的配置中会大量存在,因为Spring所谓的核心机制就是Spring依赖注入IOC.下面举一个例子说明这个问题: 先贴上目录结构: 在Eclipse中新建一个Java工程,不是JavaWeb,在这个Java配置好Spring3

java如何获取配置文件的值

转: java如何获取配置文件的值 原创 编码小王子 发布于2018-10-11 18:07:52 阅读数 2722 收藏展开 java大型项目中都会很多系统常量,比如说数据库的账号和密码,以及各种token值等,都需要统一的管理,如果零落的散布到各个类等具体的代码中的话,在后期管理上将是一场灾难,所有需要对这些变量进行统一的管理,一般都会放到web-service.properties文件中,该文件在项目中的位置如下: web-service.properties文件里的内容大概如下: 那么如

Spring-IOC:复杂值注入、各种类型赋值、bean的复用

复杂值注入准备工作 从这里开始我们要进行复杂值的注入 创建 Car public class Car { // 写入有参无参setget... private String carName; private Integer price; private String color; } 创建Book public class Book { // 写入有参无参setget... private String bookName; private Integer price; } Person类 pub