使用@Value批注访问Spring Boot application.properties

时间:2016-10-26 20:18:17

标签: spring-boot annotations

我已经阅读了我能找到的所有内容,由于某种原因,我无法完全了解如何使这项工作成功。在现有项目中挣扎了两天后,我从Spring.io下载了Rest for Content for Rest

https://spring.io/guides/gs/rest-service/

我在主文件夹中创建了一个资源文件夹,并添加了一个名为application.properties的文件,其中包含以下内容:

my.setting = HELLOTHERE
然后我按如下方式修改了Greeting类:

    package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
public class Greeting {

    private long id;
    private String content;
    private String dooDad;
    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public Greeting() {
        // TODO Auto-generated constructor stub
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }

    public String getDooDad() {
        return dooDad;
    }
    @Autowired
    public void setDooDad(@Value("${my.setting}")String dooDad) {
        this.dooDad = dooDad;
    }
}

我修改了Application类以获得@Configuration注释,如下所示:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@Configuration
public class Application {

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

我没有修改GreetingController类,但为了完整性将包含它:

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

当我运行应用程序并查看输出时,我希望看到dooDad的值,而不是它总是为空。

{"id":1,"content":"Hello, mike!","dooDad":null}

任何有助于解决这个问题的人都将不胜感激。我确实发现,如果我将@Value注释放在Application类中的变量上,它会使用正确的值填充该变量,而不是在Greeting Class中?

1 个答案:

答案 0 :(得分:3)

您通过自己实例化对象Greeting来绕过依赖注入:

return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));

因此@Component对象中的@ValueGreeting注释没有做任何事情(针对此特定实例)。

我建议你做以下事情:

  1. 将Greeting对象设为标准POJO
  2. 在构造函数中包含String dooDad
  3. 使用@Value("${my.setting}") String dooDad作为Greeting Controller
  4. 中的字段
  5. dooDad传递到您的新Greeting对象中,如下所示:

    返回新问候语(counter.incrementAndGet(),                             String.format(template,name),dooDad);

  6. 更新:添加example project以说明实现OP所述设置的各种选项。