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


上节课 【尚硅谷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。
    在这里插入图片描述

13、@ConfigurationProperties与@Value区别

1、通过@Value实现

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

@Component
public class Person {

    /**
     * <bean class="Person">
     *      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
     * <bean/>
     */

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

运行测试程序:
在这里插入图片描述
而@Value就没有这个功能。


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

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.3.1.Final</version>
        </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
在这里插入图片描述

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

<?xml version="1.0" encoding="UTF-8"?>
<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里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别。

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

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

在这里插入图片描述
运行测试类:
在这里插入图片描述
但是现在逐渐淘汰编写配置文件的方法,而是通过给容器中添加组件的方式,推荐使用全注解的方式:

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

@Bean

配置类@Configuration

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

@Bean

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

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

}

在这里插入图片描述
本次项目的结构:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
00、尚硅谷_SpringBoot_源码、课件 01、尚硅谷_SpringBoot_入门-课程简介 02、尚硅谷_SpringBoot_入门-Spring Boot简介 03、尚硅谷_SpringBoot_入门-微服务简介 04、尚硅谷_SpringBoot_入门-环境准备 05、尚硅谷_SpringBoot_入门-springboot-helloworld 06、尚硅谷_SpringBoot_入门-HelloWorld细节-场景启动器(starter) 07、尚硅谷_SpringBoot_入门-HelloWorld细节-自动配置 08、尚硅谷_SpringBoot_入门-使用向导快速创建Spring Boot应用 09、尚硅谷_SpringBoot_配置-yaml简介 10、尚硅谷_SpringBoot_配置-yaml语法 11、尚硅谷_SpringBoot_配置-yaml配置文件获取 12尚硅谷_SpringBoot_配置-properties配置文件编码问题 13、尚硅谷_SpringBoot_配置-@ConfigurationProperties与@Value区别 14尚硅谷_SpringBoot_配置-@PropertySource、@ImportResource、@Bean 15、尚硅谷_SpringBoot_配置-配置文件占位符 16、尚硅谷_SpringBoot_配置-Profile多环境支持 17、尚硅谷_SpringBoot_配置-配置文件的加载位置 18、尚硅谷_SpringBoot_配置-外部配置加载顺序 19、尚硅谷_SpringBoot_配置-自动配置原理 20、尚硅谷_SpringBoot_配置-@Conditional&自动配置报告 21、尚硅谷_SpringBoot_日志-日志框架分类和选择 22、尚硅谷_SpringBoot_日志-slf4j使用原理 23、尚硅谷_SpringBoot_日志-其他日志框架统一转换为slf4j 24、尚硅谷_SpringBoot_日志-SpringBoot日志关系 25、尚硅谷_SpringBoot_日志-SpringBoot默认配置 26、尚硅谷_SpringBoot_日志-指定日志文件和日志Profile功能 27、尚硅谷_SpringBoot_日志-切换日志框架 28、尚硅谷_SpringBoot_web开发-简介 29、尚硅谷_SpringBoot_web开发-webjars&静态资源映射规则 30、尚硅谷_SpringBoot_web开发-引入thymeleaf 31、尚硅谷_SpringBoot_web开发-thymeleaf语法 32、尚硅谷_SpringBoot_web开发-SpringMVC自动配置原理 33、尚硅谷_SpringBoot_web开发-扩展与全面接管SpringMVC 34、尚硅谷_SpringBoot_web开发-【实验】-引入资源 35、尚硅谷_SpringBoot_web开发-【实验】-国际化 36、尚硅谷_SpringBoot_web开发-【实验】-登陆&拦截器 37、尚硅谷_SpringBoot_web开发-【实验】-Restful实验要求 38、尚硅谷_SpringBoot_web开发-【实验】-员工列表-公共页抽取 39、尚硅谷_SpringBoot_web开发-【实验】-员工列表-链接高亮&列表完成 40、尚硅谷_SpringBoot_web开发-【实验】-员工添加-来到添加页面 41、尚硅谷_SpringBoot_web开发-【实验】-员工添加-添加完成 42、尚硅谷_SpringBoot_web开发-【实验】-员工修改-重用页面&修改完成 43、尚硅谷_SpringBoot_web开发-【实验】-员工删除-删除完成 44、尚硅谷_SpringBoot_web开发-错误处理原理&定制错误页面 45、尚硅谷_SpringBoot_web开发-定制错误数据 46、尚硅谷_SpringBoot_web开发-嵌入式Servlet容器配置修改 47、尚硅谷_SpringBoot_web开发-注册servlet三大组件 48、尚硅谷_SpringBoot_web开发-切换其他嵌入式Servlet容器 49、尚硅谷_SpringBoot_web开发-嵌入式Servlet容器自动配置原理 50、尚硅谷_SpringBoot_web开发-嵌入式Servlet容器启动原理 51、尚硅谷_SpringBoot_web开发-使用外部Servlet容器&JSP;支持 52、尚硅谷_SpringBoot_web开发-外部Servlet容器启动SpringBoot应用原理 53、尚硅谷_SpringBoot_Docker-简介 54、尚硅谷_SpringBoot_Docker-核心概念 55、尚硅谷_SpringBoot_Docker-linux环境准备 56、尚硅谷_SpringBoot_Docker-docker安装&启动&停止 57、尚硅谷_SpringBoot_Docker-docker镜像操作常用命令 58、尚硅谷_SpringBoot_Docker-docker容器操作常用命令 59、尚硅谷_SpringBoot_Docker-docker安装MySQL 60、尚硅谷_SpringBoot_数据访问-简介 61、尚硅谷_SpringBoot_数据访问-JDBC&自动配置原理 62、尚硅谷_SpringBoot_数据访问-整合Druid&配置数据源监控 63、尚硅谷_SpringBoot_数据访问-整合MyBatis(一)-基础环境搭建 64、尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis 65、尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis 66、尚硅谷_SpringBoot_数据访问-SpringData JPA简介 67、尚硅谷_SpringBoot_数据访问-整合JPA 68、尚硅谷_SpringBoot_原理-第一步:创建SpringApplication 69、尚硅谷_SpringBoot_原理-第二步:启动应用 70、尚硅谷_SpringBoot_原理-事件监听机制相关测试 71、尚硅谷_SpringBoot_原理-自定义starter 72、尚硅谷_SpringBoot_结束语

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值