Spring使用@Value注解与@PropertySource注解加载配置文件操作

1、@Value注解简介

Spring框架提供的@Value注解可以将外部的值动态注入到Bean中,@Value注解使用在字段、构造器参数和方法参数上。

@Value可以指定属性取值的表达式,支持通过#{}使用SpringEL来取值,也支持使用${}来将属性来源中(Properties文件、本地环境变量、系统属性等)的值注入到Bean的属性中。

此注解值的注入发生在AutowiredAnnotationBeanPostProcessor类中。

@Value注解实现以下几种情况:

(1)注入普通字符;

(2)注入操作系统属性;

(3)注入表达式运算结果;

(4)注入其他Bean的属性;

(5)注入文件内容;

(6)注入网址内容;

(7)注入属性文件。

2、@PropertySource注解简介

@PropertySource注解可以加载指定的属性文件(*.properties)到 Spring 的 Environment 中。可以配合 @Value 和 @ConfigurationProperties 使用。语法格式如下:

@PropertySource(value = "classpath:com/pjb/el/user.properties",encoding = "UTF-8")
public class UserInfo
{
}

【实例】使用@Value注解与@PropertySource注解加载配置文件。

(1)创建用户信息属性文件(user.properties)

user.userId=1
user.userName=pan_junbiao的博客
user.blogUrl=https://blog.csdn.net/pan_junbiao
user.remark=您好,欢迎访问 pan_junbiao的博客

(2)创建用户信息实体类(UserInfo.java)

使用@PropertySource注解加载配置文件信息,然后使用@Value注解注入属性值。

package com.pjb.el;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * 用户信息实体类
 * @author pan_junbiao
 **/
@Component
@PropertySource(value = "classpath:com/pjb/el/user.properties",encoding = "UTF-8")
public class UserInfo
{
    //用户ID
    @Value("${user.userId}")
    private int userId;

    //用户姓名
    @Value("${user.userName}")
    private String userName;

    //博客地址
    @Value("${user.blogUrl}")
    private String blogUrl;

    //备注
    @Value("${user.remark}")
    private String remark;

    //省略getter与setter方法...
}

(3)运行

public static void main(String[] args)
{
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ElConfig.class);
    UserInfo userInfo = context.getBean(UserInfo.class);

    //打印用户信息
    System.out.println("用户编号:" + userInfo.getUserId());
    System.out.println("用户姓名:" + userInfo.getUserName());
    System.out.println("博客地址:" + userInfo.getBlogUrl());
    System.out.println("备注信息:" + userInfo.getRemark());
}

执行结果:

3、综合实例

【实例】使用@Value注解实现多种情况值的注入和@PropertySource注解加载配置文件。

(1)添加相关的jar包

添加Spring支持及commons-io依赖,pom.xml文件的配置如下:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>5.2.3.RELEASE</spring.version>
</properties>

<dependencies>
    <!-- Spring框架 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- commons-io依赖 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
</dependencies>

添加 commons-io.jar 可以简化文件相关操作,本实例中使用 commons-io 将 file 转换成字符串。

(2)创建资源文件

在resources资源目录下创建名称为info.txt的文本文件,文件内容为:您好,欢迎访问 pan_junbiao的博客。

在resources资源目录下创建数据库连接配置文件db.properties,该文件配置如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_admin
jdbc.username=root
jdbc.password=123456

(3)需被注入的Bean

创建名为OtherUser.java的用户信息类。

package com.pjb.el;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 用户信息类
 * @author pan_junbiao
 **/
@Component
public class OtherUser
{
    //用户名称
    @Value("pan_junbiao的博客")
    private String userName;

    //博客地址
    @Value("https://blog.csdn.net/pan_junbiao")
    private String blogUrl;

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String userName)
    {
        this.userName = userName;
    }

    public String getBlogUrl()
    {
        return blogUrl;
    }

    public void setBlogUrl(String blogUrl)
    {
        this.blogUrl = blogUrl;
    }
}

(4)配置类

创建名为ElConfig.java的配置类。

package com.pjb.el;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;

/**
 * 配置类
 * @author pan_junbiao
 **/
@Configuration
@ComponentScan("com.pjb.el")
@PropertySource("classpath:db.properties")
public class ElConfig
{
    /**
     * 注入普通字符串
     */
    @Value("您好,欢迎访问 pan_junbiao的博客")
    private String comment;

    /**
     * 注入操作系统属性
     */
    @Value("#{systemProperties['os.name']}")
    private String osName;

    /**
     * 注入表达式运算结果
     */
    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber;

    /**
     * 注入其他Bean的属性
     */
    @Value("#{otherUser.userName}")
    private String fromUserName;

    @Value("#{otherUser.blogUrl}")
    private String fromBlogUrl;

    /**
     * 注入文件资源
     */
    @Value("classpath:info.txt")
    private Resource testFile;

    /**
     * 注入网址资源
     */
    @Value("https://blog.csdn.net/pan_junbiao")
    private Resource testUrl;

    /**
     * 注入配置文件
     */
    @Value("${jdbc.driver}")
    private String jdbc_driver;

    @Value("${jdbc.url}")
    private String jdbc_url;

    @Value("${jdbc.username}")
    private String jdbc_username;

    @Value("${jdbc.password}")
    private String jdbc_password;

    @Autowired
    private Environment environment;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer()
    {
        return new PropertySourcesPlaceholderConfigurer();
    }

    public void outputResource()
    {
        try
        {
            System.out.println("注入普通字符串:");
            System.out.println(comment);
            System.out.println("------------------------------------------------");

            System.out.println("注入操作系统属性:");
            System.out.println(osName);
            System.out.println("------------------------------------------------");

            System.out.println("注入表达式运算结果:");
            System.out.println(randomNumber);
            System.out.println("------------------------------------------------");

            System.out.println("注入其他Bean的属性:");
            System.out.println("用户名称:" + fromUserName);
            System.out.println("博客地址:"+ fromBlogUrl);
            System.out.println("------------------------------------------------");

            System.out.println("注入文件资源:");
            System.out.println("文件中的内容:" + IOUtils.toString(testFile.getInputStream()));
            System.out.println("------------------------------------------------");

            System.out.println("注入配置文件(方式一):");
            System.out.println("数据库驱动:" + jdbc_driver);
            System.out.println("数据库连接:" + jdbc_url);
            System.out.println("数据库用户:" + jdbc_username);
            System.out.println("数据库密码:" + jdbc_password);
            System.out.println("------------------------------------------------");

            System.out.println("注入配置文件(方式二):");
            System.out.println("数据库驱动:" + environment.getProperty("jdbc.driver"));
            System.out.println("数据库连接:" + environment.getProperty("jdbc.url"));
            System.out.println("数据库用户:" + environment.getProperty("jdbc.username"));
            System.out.println("数据库密码:" + environment.getProperty("jdbc.password"));
            System.out.println("------------------------------------------------");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

注入配置配件需要使用@PropertySource注解指定文件地址,若使用@Value注解,则要配置一个PropertySourcesPlaceholderConfigurer的Bean。注意,@Value("${jdbc.driver}")使用的是“${}”而不是“#{}”。

注入Properties还可以从Environment中获得。

(5)运行

package com.pjb.el;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 运行类
 * @author pan_junbiao
 **/
public class Main
{
    public static void main(String[] args)
    {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ElConfig.class);
        ElConfig resourceService = context.getBean(ElConfig.class);
        resourceService.outputResource();
        context.close();
    }
}

执行结果:

spring中@value注解需要注意

首先

@value需要参数,这里参数可以是两种形式:

@Value(“#{configProperties[‘t1.msgname']}”)

或者

@Value(“${t1.msgname}”);

其次

下面我们来看看如何使用这两形式,在配置上有什么区别:

1、@Value(“#{configProperties[‘t1.msgname']}”)这种形式的配置中有“configProperties”,其实它指定的是配置文件的加载对象:配置如下:

classpath:/config/t1.properties

这样配置就可完成对属性的具体注入了;

2、@Value("${t1.msgname}")这种形式不需要指定具体加载对象,这时候需要一个关键的对象来完成PreferencesPlaceholderConfigurer,这个对象的配置可以利用上面配置1中的配置,也可以自己直接自定配置文件路径。

如果使用配置1中的配置,可以写成如下情况:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="properties" ref="configProperties"/>
</bean>

如果直接指定配置文件的话,可以写成如下情况:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="location">
    <value>config/t1.properties</value>
    </property>
</bean>**重点内容**

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring通过@Value注解注入属性的几种方式

    场景 假如有以下属性文件dev.properties, 需要注入下面的tag tag=123 通过PropertyPlaceholderConfigurer <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="dev.properties" /&

  • Spring中利用配置文件和@value注入属性值代码详解

    1 简单属性值注入 package com.xy.test1; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service // 需要被注入属性值的类需要被Spring管理 public class PropertiesService1 { // 利用@Value注解,即使没有该属性或者属性文件也不会报错 // @Value输入

  • Spring注解@Value及属性加载配置文件方式

    Spring中使用@Value注解给bean加载属性的配置文件有两种使用方式 第一种:使用@Value("#{configProperties['websit.msgname']}") spring中配置属性加载文件的配置方式 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <p

  • SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    1.application.properties 配置文件 mail.username=xue@163.com mail.password=xue mail.host=smtp.163.com mail.smtp.auth=true 2.给普通变量赋值,直接在变量上添加 @Value 注解 import org.springframework.beans.factory.annotation.Value; public class MailConfig { @Value("${mail.user

  • Spring使用@Value注解与@PropertySource注解加载配置文件操作

    1.@Value注解简介 Spring框架提供的@Value注解可以将外部的值动态注入到Bean中,@Value注解使用在字段.构造器参数和方法参数上. @Value可以指定属性取值的表达式,支持通过#{}使用SpringEL来取值,也支持使用${}来将属性来源中(Properties文件.本地环境变量.系统属性等)的值注入到Bean的属性中. 此注解值的注入发生在AutowiredAnnotationBeanPostProcessor类中. @Value注解实现以下几种情况: (1)注入普通字

  • Spring Boot加载配置文件的完整步骤

    前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? SpringBoot从哪些地方加载配置文件? SpringBoot是如何支持yaml和properties类型的配置文件? 如果要支持json配置应该如何做? SpringBoot的配置优先级是怎么样的? placeholder是如何被解析的? 带着我们的问题一起去看一下SpringBoot配置相关的源

  • 详解Spring简单容器中的Bean基本加载过程

    本篇将对定义在 XMl 文件中的 bean,从静态的的定义到变成可以使用的对象的过程,即 bean 的加载和获取的过程进行一个整体的了解,不去深究,点到为止,只求对 Spring IOC 的实现过程有一个整体的感知,具体实现细节留到后面用针对性的篇章进行讲解. 首先我们来引入一个 Spring 入门使用示例,假设我们现在定义了一个类 org.zhenchao.framework.MyBean ,我们希望利用 Spring 来管理类对象,这里我们利用 Spring 经典的 XMl 配置文件形式进行

  • 分析Spring框架之设计与实现资源加载器

    目录 一.前言 二.目标 三.设计 四.实现 4.1.工程结构 4.2.资源加载接口定义和实现 4.3.包装资源加载器 4.4.Bean定义读取接口 4.5.Bean定义抽象类实现 4.6.解析XML处理Bean注册 五.测试 5.1.事先准备 5.2.配置文件 5.3.单元测试(资源加载) 5.4.单元测试(配置文件注册Bean) 六.总结 一.前言 你写的代码,能接的住产品加需求吗? 接,是能接的,接几次也行,哪怕就一个类一片的 if...else 也可以!但接完成什么样可就不一定了,会不会

  • spring boot微服务场景下apollo加载过程解析

    目录 集成使用 1.添加gradle依赖 2.配置application.properties 必须配置 可选配置 加载过程解析 postProcessEnvironment方法逻辑解析 initialize方法逻辑解析 结语 集成使用 1.添加 gradle 依赖 implementation "com.ctrip.framework.apollo:apollo-client:1.6.0" 2.配置 application.properties apollo 自身的配置共包含 9 项

  • Spring Junit单元测试加载配置文件失败问题

    JUnit是Java中最有名的单元测试框架,用于编写和运行可重复的测试,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. 使用SpringJunit单元测试,通过@ContextConfiguration加载配置文件后,只会在src/test/resources目录下寻找配置文件,不会加载src/main/resources中的. 这样就导致了项目可以正常启动,但是单元测试时会提示找不到注入的类. 可以通过pom.xml配置来解决该问题

  • SpringBoot加载配置文件的实现方式总结

    目录 一.简介 二.代码实践 2.1.通过@value注解实现参数加载 2.2.通过@ConfigurationProperties注解实现参数加载 2.3.通过@PropertySource注解实现配置文件加载 2.4.通过自定义环境处理类,实现配置文件的加载 2.5.最后,我们来介绍一下yml文件读取 三.小结 一.简介 在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面,以便更加统一.灵活的管理服务配置信息.比如,数据库.eureka.zookeeper.r

  • 在springboot中实现个别bean懒加载的操作

    懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. @Lazy 在需要懒加载的bean上加上@Lazy就可以了 补充知识:springboot组件懒加载的坑及加载规则 什么是懒加载? 懒加载的意思是不在项目启动的时候实例出来这个组件 @RestController public class ApiController { @Autowired Skill kobSkillImpl; @Request

  • mybatis 加载配置文件的方法(两种方式)

    一. 使用sqlSessionFactory 的 mapperLocations 进行加载, <!-- SessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton"> <property name="dataSource" ref=

随机推荐