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

1 简介

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

2 实践

2.1 项目结构

项目主要有config包,其中ServerConfig类负责从外部配置文件application.properties中读入tomcat开头的配置。controller包中TestValue则是测试注入是否成功,整个项目为web架构。
SpringBoot中实用@Value注入配置文件中的配置

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测试结果

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

3.2 单步调试

把断点放进getUrl函数中,可以看到如下的结果:
SpringBoot中实用@Value注入配置文件中的配置
三个值可以成功取到。

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注入外部资源