SpringBoot中实用@Value注入配置文件中的配置

1 简介

出差时,记得想要自动获取项目启动的host和端口号时,起初自己使用了监听器的机制,但发现当电脑具有多个ip时,会出现错误,随后就选择了使用配置文件中配置的方式来获取项目对应的tomcat地址。当时就是使用@Value注解来做的。

2 实践

2.1 项目结构

项目主要有config包,其中ServerConfig类负责从外部配置文件application.properties中读入tomcat开头的配置。controller包中TestValue则是测试注入是否成功,整个项目为web架构。
在这里插入图片描述

2.2pom.xml

为了避免繁琐的getter/setter取值设值函数,引入了Lombok插件,插件可以从IntelliJ Lombok plugin下载,注意要根据IDEA的相应版本下载,或者直接在pom文件中引入相应的dependency也可以。

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.20</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.31</version>
		</dependency>

其中fastjson是为了数据处理方便引入的,主要是为了JSON数据的处理。

2.2 application.properties

2.2.1 server配置

server.port=9090
server.servlet.context-path=/helloboot

tomcat.ip=192.168.1.110
tomcat.port=8787
tomcat.projectName=screenshot

logging.file=log.log
logging.level.org.springframework.web: DEBUG

在配置文件中通过设置前两项配置的结果是当前项目被部署在9090端口,并且要访问相应的Controller要添加/helloboot前缀。这可以通过在控制台中得到验证。

Tomcat started on port(s): 9090 (http) with context path '/helloboot'

2.2.2 logging配置

logging.file=log.log
logging.level.org.springframework.web=debug
logging.level.com.wisely.ch5_2_2=debug

为日志配置,表示要在当前目录下生成配置文件。随后的两个则是要为org.springframework.web中的日志级别调整为debug,并且案例所在包日志级别也为debug。

  1. logging.path
    该属性用来配置日志文件的路径
  2. logging.file
    该属性用来配置日志文件名,如果该属性不配置,默认文件名为spring.log
    关于Spring Boot的日志级别默认为INFO,关于日志配置的内容,参见博客Spring Boot系列——日志配置

2.2.3 tomcat配置

关于tomcat起头的三个配置,则是实践中关注的重点,要把这三个值注入到Bean中为我们使用。

2.3 ServerConfig使用@Value注入

package com.wisely.ch5_2_2.config;

import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 获得项目所在的tomcat配置
 *
 * @Owner:
 * @Time: 2019/3/31-16:15
 */
@Service
@Log
public class ServerConfig {

    @Value("${tomcat.ip}")
    @lombok.Getter
    private String ip;

    @Value("${tomcat.port}")
    @lombok.Getter
    private int port;

    @Value("${tomcat.projectName}")
    @lombok.Getter
    private String projectName;

    public String getUrl() {
        log.info("Enter getUrl");
        return "http://"+getIp()+":"+getPort()+"/"+getProjectName();
    }
  }

在该类中,使用Lombok,可以看到通过这个插件的使用,可以大大减少冗长的取值/设值函数的编写,有利于清晰的看到主要函数的逻辑,是个非常好的工具,通过@Log注解为类注入了一个默认的日志对象log.直接使用即可。
关于Lombok插件的使用,参见博客Lombok介绍、使用方法和总结。在本篇博客中,这非重点,不再赘述。
ServerConfig类的工作很简单,直接注入配置文件中的tomcat起头的三个配置,读入Bean中。可以看到在Spring Boot中不再需要@PropertySource指明properties文件的位置,在Spring Boot中只需在application.properties定义属性,直接使用@Value注入即可。

2.4 TestValue 通过Controller进行测试

package com.wisely.ch5_2_2.controller;

import com.alibaba.fastjson.JSONObject;
import com.wisely.ch5_2_2.config.ServerConfig;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * 测试注入
 *
 * @Owner:
 * @Time: 2019/3/31-16:29
 */
@RestController
@Log
public class TestValue {
    @Autowired
    private ServerConfig serverConfig;

    @RequestMapping(value = "/getImg",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public String getImgeLoc() {
        log.info("Enter getImgeLoc");
        System.out.println("--   Handling   --");
        String fileName = UUID.randomUUID().toString()+".jpg";
        JSONObject result = new JSONObject();
        result.put("imgUrl", serverConfig.getUrl()+"/"+fileName);
        System.out.println("--   over   --");
        return result.toJSONString();
    }
}

该类比较简单,并没有复杂的内容,不再赘述。

2.5启动类 Ch522Application

package com.wisely.ch5_2_2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class Ch522Application {

    public static void main(String[] args) {
	 	SpringApplication.run(Ch522Application.class, args);
    }
}

3运行结果

3.1使用Restful测试结果

在这里插入图片描述

3.2 单步调试

把断点放进getUrl函数中,可以看到如下的结果:
在这里插入图片描述
三个值可以成功取到。

3.4 控制台输出

2019-03-31 17:14:31.665  INFO 13736 --- [nio-9090-exec-2] com.wisely.ch5_2_2.controller.TestValue  : Enter getImgeLoc
--   Handling   --
2019-03-31 17:14:32.189  INFO 13736 --- [nio-9090-exec-2] com.wisely.ch5_2_2.config.ServerConfig   : Enter getUrl
--   over   --

4 总结

这个小博客是个比较综合的博客,可以从博客中看到Spring Boot中日志配置,Lombok的使用,以及从application.properties文件中注入配置,通过这个小博客,希望能够帮助读者理解@Value的灵活性。

										2019-03-31于南京理工大学四教A110

5参考

使用@Value和@PropertySource注入外部资源

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: @Value 注解是 Spring 框架用于获取配置文件的值的注解。它可以用来注入配置文件的值到 Bean 的属性。@Value 支持从环境变量、命令行参数和配置文件获取值。语法为:@Value("${propertyName}")。 ### 回答2: Spring Boot的@Value注解是用于注入配置文件的属性值的注解。它可以用于任何Spring Bean,并且可以使用SpEL表达式。常用来注入一些配置文件的属性值,比如数据库连接地址、用户名、密码等。这些属性值可以从application.properties(或application.yml)文件读取,也可以从环境变量或命令行参数读取。 @Value注解可以用于属性、方法、构造器等注入对象。对于属性注入,可以直接注入属性值或SpEL表达式,也可以注入一个BeanNameReadingPropertyResolver实例来动态读取配置文件的属性。对于方法注入,可以将属性值注入方法参数。 @Value注解还可以用于注入系统属性和环境变量。如果配置文件没有定义某个属性,可以通过这个注解来获取系统属性或环境变量的值。使用${...}语法来引用系统属性和环境变量时,在属性名之前加上“systemProperty.”或“systemEnvironment.”前缀。 除了可以读取配置文件的属性值,@Value注解还可以使用SpEL表达式来计算属性的值。表达式可以使用#{...}语法来定义。表达式使用的属性名和方法名必须与注入对象的属性名和方法名一致,否则会抛出运行时异常。可以在表达式使用Spring EL的所有功能,包括算术运算、逻辑运算、函数调用等。 总之,@Value注解是Spring Boot非常重要的一个注解,它可以方便地将配置文件的属性值注入到Bean,并且支持SpEL表达式,有助于提高代码的可读性和灵活性。 ### 回答3: 在使用Spring Boot开发时,我们可能需要在配置文件定义一些属性,比如数据库连接的用户名、密码等。而在Java类使用这些属性时,就需要用到@Value注解了。 @Value注解可以将配置文件定义的属性值注入到Java类的字段。注解的使用方式为在字段前加上@Value并指定属性的名称。例如,如果我们在配置文件定义了一个名为server.port的属性,那么可以在Java类使用@Value("${server.port}")来获取该属性的值,并将其注入到该类的字段。 在实际的开发,一般会将@Value注解用于Spring管理的Bean,以便更方便地对其进行配置和管理。此外,在Spring Boot还可以使用@ConfigurationProperties注解来指定一个类或Bean对应的配置文件前缀,并将相应的属性注入到该类或Bean。 需要注意的是,在使用@Value注解时,如果属性名称是从配置文件读取的,则需要在属性名称前加上“${”和“}”,以便告诉Spring容器该属性需要从配置文件获取。此外,还可以使用默认值来指定属性的值,例如@Value("${server.port:8080}"),表示如果配置文件没有定义该属性,则使用默认值8080。 总之,@Value注解是Spring Boot非常实用的注解,它可以帮助我们将配置文件的属性值注入到Java类,从而方便地进行开发、配置和管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值