Springboot配置文件值注入

简介: Springboot配置文件值注入

配置文件



1. application.yml


# 字面量(数字,字符串,布尔)
server:
  port: 8081
user:
  user-name: 张三
  age: 26
  mobile: 18369615874
  hobby: [吃饭,睡觉,打豆豆]
  map: {k1: 吃饭,k2: 睡觉}
  pwd: 123456


2. test.properties


user.user-name=李四
user.pwd=1234567896
user.mobile=1889394848223
user.age=289
user.hobby=吃饭,睡觉,打豆豆
user.map.k1=123456
user.map..k2=456789


导入jar包依赖



<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示,配合热启动更好用‐‐>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐configuration‐processor</artifactId>
    <optional>true</optional>
</dependency>
<!--热启动-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>


一、@ConfigurationProperties注解



1、@ConfigurationProperties作用


  1. 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;*prefix="user":配置文件中user下面的所有属性和javaBena进行一一映射
  2. 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能,下面的注解都是一样
  3. @ConfigurationProperties默认从全局配置文件中获取值;


2、@ConfigurationProperties用法


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private String userName;
    private String mobile;
    private String pwd;
    private int age;
    private String[] hobby;
    private Map<String,String> map;
}


二、@Value注解



1、@Value的作用

将配制文件中的某个属性和bean中的值进行绑定注入,也可以使用SPeL给bean属性赋值


2、@Value的使用方法

2.1. 将bean中属性和主配置文件中的内容进行绑定和注入,不支持复杂类型的封装,如果有复杂类型就会原样输出,如果是多对键值对的map会直接报错


@Data
@Component
//@ConfigurationProperties(prefix = "user")
@Validated
public class User {
    @Value("${user.user-name}")
    private String userName;
    @Value("${user.mobile}")
    private String mobile;
    @Value("${user.pwd}")
    private String pwd;
    @Value("${user.age}")
    private int age;
    @Value("${user.hobby}")
    private String[] hobby;
    //@Value("${user.map}")
    private Map<String,String> map;
}
//打印结果
2019-07-04 10:16:30.211  INFO 29088 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 3.013 seconds (JVM running for 3.856)
User(userName=张三, mobile=18369615874, pwd=123456, age=26, hobby=[${user.hobby}], map=null)
${user.hobby}
2019-07-04 10:16:30.405  INFO 29088 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'


2.2. 直接给bean注入字面量属性,数组只能注入一个值,不支持map和对象


@Data
@Component
//@ConfigurationProperties(prefix = "user")
@Validated
public class User {
    @Value("李四")
    private String userName;
    @Value("18697563215")
    private String mobile;
    @Value("123456")
    private String pwd;
    @Value("25")
    private int age;
    @Value("吃饭")
    private String[] hobby;
    //@Value("k1:12456")
    private Map<String,String> map;
}


2.3. 使用SpEL表达式实现注入


@Data
@Component
//@ConfigurationProperties(prefix = "user")
@Validated
public class User {
    //1、SpEL字面量(数字,字符串(字符串要带单引号),布尔值)
    @Value("#{'张三'}")
    private String userName;
    @Value("#{'18396547866'}")
    private String mobile;
    //2、调用java方法
    @Value("#{new String(new java.util.Random().nextInt(10000000))}")
    private String pwd;
    @Value("#{new java.util.Random().nextInt(110)}")
    private int age;
    //3、数组
    @Value("#{{'吃饭','睡觉','打豆豆'}}")
    private String[] hobby;
    //4、map和object
    @Value("#{{'k1':'victory','k2':'haha'}}")
    private Map<String,String> map;
}
//结果打印
2019-07-04 11:18:11.290  INFO 8856 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 4.371 seconds (JVM running for 5.547)
User(userName=张三, mobile=18396547866, pwd=1561715, age=45, hobby=[吃饭, 睡觉, 打豆豆], map={k1=victory, k2=haha})
吃饭
睡觉
打豆豆
2019-07-04 11:18:11.571  INFO 8856 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'


三、@Value和@ConfigurationProperties的区别



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


名词解释:

  1. 松散绑定(松散语法):以userName为例,松散绑定是指userName、user-name和user_name是等价的,可是识别
  2. Spel:Spring表达式
  3. JSR303参数校验:是指在注入之前进行参数的格式校验
  4. 复杂类型的封装:支持数组、map和对象


四、@PropertySource注解



1. @PropertySource作用

  1. 通知spring容器加载指定的一个或多个配置文件
  2. 主配置文件和指定配置文件都有相应的配置属性以主配置文件的属性内容为准
  3. 多个配置文件中都存在同一属性以第一个配置文件为准
  4. 多个配置文件才凑成整个bean的属性时,配置内容互补
  5. 只能读取.properties文件


2. @PropertySource使用方法

  1. 配合@ConfigurationProperties使用


import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Map;
import java.util.Random;
@Data
@Component
@PropertySource(value = {"classpath:test.properties"})
@ConfigurationProperties(prefix = "user")
public class User {
    private String userName;
    private String mobile;
    private String pwd;
    private int age;
    private String[] hobby;
    private Map<String,String> map;
}
//打印结果
2019-07-04 15:50:52.969  INFO 36388 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 4.356 seconds (JVM running for 5.111)
User(userName=张三, mobile=188939484826, pwd=123456789, age=28, hobby=[吃饭, 睡觉, 打豆豆], map={k1=123456, k2=456789})
吃饭
睡觉
打豆豆


  1. 配合@Value使用


@Data
@Component
@PropertySource(value = {"classpath:test.properties","classpath:test1.properties"})
//@ConfigurationProperties(prefix = "user")
public class User {
    @Value("${user.user-name}")
    private String userName;
    @Value("${user.mobile}")
    private String mobile;
    @Value("${user.pwd}")
    private String pwd;
    @Value("${user.age}")
    private int age;
    private String[] hobby;
    private Map<String,String> map;
}
//打印结果
2019-07-04 15:54:56.870  INFO 35940 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 4.548 seconds (JVM running for 5.963)
User(userName=张三, mobile=188939484826, pwd=123456789, age=28, hobby=null, map=null)


五、@ImportResource注解和@Bean



1. @ImportResource的作用

  1. 导入Spring的配置文件,让配置文件里面的内容生效;
  2. SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效,加载进来;
  3. @ImportResource标注在一个配置类上


2. @ImportResource的使用方法

  1. 添加配制文件


<?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="com.example.demo.service.HelloService"></bean>
</beans>


  1. 在启动类上添加@ImportResource注解


@ImportResource(value = {"classpath:bean.xml"})
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
//service类
package com.example.demo.service;
public class HelloService {
    public void say(){
        System.out.println("我是helloService");
    }
}


  1. 测试


@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    User user;
    @Autowired
    HelloService helloService;
    @Test
    public void contextLoads() {
        helloService.say();
    }
}
//打印结果
2019-07-04 16:30:24.621  INFO 36608 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 3.795 seconds (JVM running for 4.732)
我是helloService


3. 注意,虽然springboot支持这种写法,但建议使用@Bean注解的方式来替代spring的配置


  1. 写一个配置类


package com.example.demo.config;
import com.example.demo.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyHelloServiceConfig {
    @Bean //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    public HelloService helloService(){
        System.out.println("@Bean给spring中添加组件了");
        return new HelloService();
    }


  1. 测试代码同上


//2019-07-04 16:37:42.161  INFO 27808 --- [           main] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 3.476 seconds (JVM running for 4.402)
我是helloService
目录
相关文章
|
6月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
977 0
|
2月前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
256 2
|
7月前
|
Java
springboot字段注入@value细节
springboot字段注入@value细节
|
7月前
|
Java
springboot自动注入避坑
springboot自动注入避坑
|
2月前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
157 3
|
3月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
216 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
3月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
101 0
|
4月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
128 0
|
5月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
57 0
|
5月前
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
203 0