【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入

【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入

  • 12、properties配置文件编码问题
    • 1、编辑配置文件
    • 2、properties文件编码问题
  • 13、@ConfigurationProperties与@Value区别
    • 1、通过@Value实现
    • 2、区别
  • 14、@PropertySource、@ImportResource、@Bean
    • @PropertySource
    • @ImportResource
    • @Bean
      • 配置类@Configuration
      • @Bean

上节课 【尚硅谷Spring Boot】配置9 ~ 11:yaml语言在yml文件中实现的配置文件怎么在properties文件中实现呢?

12、properties配置文件编码问题

1、编辑配置文件

编辑application.properties文件:

# 配置person的值
person.last-name=张三
person.age=3
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15

运行测试类:
在这里插入图片描述
如果有乱码出现,说明编码格式不是utf-8.

2、properties文件编码问题

IDEA默认格式utf-8,properties文件默认格式ascii码,所以会有乱码问题。

  • 在设置中更改properties配置文件的编码为utf-8。
    【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第1张图片

13、@ConfigurationProperties与@Value区别

1、通过@Value实现

除了通过@ConfigurationProperties来获取配置文件值外,还可以通过注解@Value

@Component
public class Person {

    /**
     * 
     *      
     * 
     */

    //@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;

	······
}

在这里插入图片描述

2、区别

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

  • 松散语法属性名匹配规则(Relaxed binding)
    • person.firstName:使用标准方式
    • person.first-name:大写用-
    • person.first_name:大写用_
    • PERSON_FIRST_NAME:
      • 推荐系统属性使用这种写法

@ConfigurationProperties支持JSR303进行配置文件值校验(通过注解@Validated):

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
	
    @Email  // 这个注解作用:lastName必须是邮箱格式
    private String lastName;
    private Integer age;
    private Boolean boss;

    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    
    ······
}

运行测试程序:
【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第2张图片
而@Value就没有这个功能。


注意:使用@Validated需要添加依赖,否则@Email会报错:

        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-validatorartifactId>
            <version>5.3.1.Finalversion>
        dependency>

那么问题来了,在@ConfigurationProperties和@Value之间如何选择呢?

  • 如果只是在业务逻辑中需要获取一下配置文件中的某一项值,使用@Value;
  • 如果专门编写了一个JavaBean来和配置文件进行映射,使用@ConfigurationProperties

范例:使用@Value的情况
编写类ConfigController

@RestController
public class ConfigController {

    @Value("${person.last-name}")
    private String name;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return "Hello " + name;
    }

}

运行主程序类ConfigApplication
【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第3张图片

14、@PropertySource、@ImportResource、@Bean

@PropertySource

@PropertySource作用:加载指定的配置文件,绑定到@ConfigurationProperties指定的类中。
还是以Person类为例,如果把所有配置都写在全局配置文件(application.properties/yml)中,该文件可能会比较复杂,所以可以把与Spring Boot无关的配置提取出来,分散到不同配置文件中。
范例:在resources中创建配置文件:person.properties

person.last-name=李四
person.age=12
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15

范例:修改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;
    
	······
}

运行测试类ConfigApplicationTests

自己实验时不能正常工作…

@ImportResource

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

范例:新建文件夹service,创建HelloConfig类

public class HelloService {
	// 不需要有功能,只做示范
}

在resources中创建配置文件:beans.xml


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="demo.config.service.HelloService">bean>

beans>

编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
class ConfigApplicationTests {
    @Autowired
    Person person;  // 注入Person类

    @Autowired
    ApplicationContext ioc;  // 注入ioc容器

    @Test  // 测试容器中有没有HelloService
    public void testHelloService(){
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);
    }

    @Test
    public void contextLoads() {
        System.out.println(person);  // 输出
    }

}

【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第4张图片
可以得出,Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别。

想让Spring的配置文件生效,就需要加载进来。

  • 通过@ImportResource标注在配置类上
@ImportResource(locations = {"classpath:beans.xml"})

【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第5张图片
运行测试类:
【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第6张图片
但是现在逐渐淘汰编写配置文件的方法,而是通过给容器中添加组件的方式,推荐使用全注解的方式:

  • 1、配置类@Configuration ➡ Spring配置文件
  • 2、使用@Bean给容器中添加组件

@Bean

配置类@Configuration

@Configuration作用: 指明当前类是一个配置类,替代之前的Spring配置文件。

@Bean

/**
 * @Configuration:指明当前类是一个配置类,替代之前的Spring配置文件
 * 
 * @Bean:添加标签,将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
 * 替代之前的配置文件中用标签添加组件
 */
@Configuration
public class MyAppConfig {

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

}

【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第7张图片
本次项目的结构:
【尚硅谷Spring Boot】配置12 ~ 14:配置文件值注入_第8张图片

你可能感兴趣的:(【Spring,Boot】初级学习,spring,boot,spring)