如何在Spring应用程序中使用外部配置?
package hello.example2.Container
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.client.RestTemplate
@RestController
class ContainerController {
@RequestMapping("/container/{cid}")
public list(@PathVariable Integer cid) {
def template = new RestTemplate();
def container = template.getForObject("http://localhost:5050/container/" + cid.toString(), Container);
return container;
}
}
我想用配置选项(f.e.application.yml或application.properties)替换“http://localhost:5050”。
这是我的应用程序文件(Groovy):
package hello.example2
import groovy.transform.CompileStatic
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.Configuration
@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@CompileStatic
class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
我试图设置“@Configuration”和“@EnableAutoConfiguration”但说实话我不知道他们在做什么。我是Java / Groovy和Spring框架的新手(但不是一般的编程)。
我已经阅读了这些页面,但没有完整的示例,只有片段:
[2] https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
答案 0 :(得分:6)
在配置文件(application.yml或application.properties)中添加一个新条目:
endpointUrl: http://localhost:5050
然后在您的控制器中注入该属性:
@RestController
class ContainerController {
@Value("${endpointUrl}")
private String ednpointUrl;
@RequestMapping("/container/{cid}")
public list(@PathVariable Integer cid) {
def template = new RestTemplate();
def container = template.getForObject(endpointUrl+"/container/" + cid.toString(), Container);
return container;
}
}
答案 1 :(得分:4)
虽然上面回答了你的问题。我不相信这一点。 让我逐一阐述:
@Configuration
:您可以通过两种方式设置弹簧配置。
a)使用xml文件。
b)并使用Java Configuration类。
要将Java类用作spring的配置文件,您需要添加@Configuration
注释。在此Configuration类中,现在可以使用@Bean标记指定bean。使用singleton or prototype
注释将范围指定为@Scope
。您可以使用xml配置文件执行所有操作。
此外,一个广泛的社区不喜欢用于配置的xmls,因此,他们更喜欢在java类中配置spring。
@EnableAutoConfiguration
:来自springboot
框架。它会自动配置传统或预期的配置,以后可以覆盖。基本上,它明智地使用不同的java配置类为不同的默认配置配置默认所需的默认bean。
Regarding externalising configuration
:您可以将配置外部化到application.properties或application.yml。以下应该是位置。
以上是按优先顺序排列的。因此,如果config目录存在于当前项目目录下。它的优先级最高。
下面我要添加我的应用程序的树形图。可能会有所帮助。
vinayprajapati@localhost:~/Desktop/project/gradleSpringBoot$ tree
.
├── build.gradle
├── gradleSpringBoot.iml
└── src
├── main
│ ├── groovy
│ │ └── org.test
│ │ ├── components
│ │ │ └── TestComponent.groovy
│ │ ├── configuration
│ │ │ └── BaseConfiguration.groovy
│ │ |
│ │ └── utils
│ │ ├── AppConfig.groovy
│ │ └── AppInfo.groovy
│ ├── java
│ │ └── org
│ │ └── test
│ │ ├── GradleSpringBootApplication.java
│ │ └── HelloController.java
│ └── resources
│ ├── application-qa.yml
│ ├── application-uat.yml
│ ├── application.properties
│ ├── application.yml
│ ├── static
│ └── templates
└── test
└── java
└── org
└── test
└── GradleSpringBootApplicationTests.java
看起来您遇到了问题排查。
让我们做一件事。将配置文件放在上面的树形图中的资源中,并从项目中的所有其他位置删除它。这样做的原因是根目录或/ config子目录中的任何配置文件都具有更高的优先级,因此会覆盖类路径中的配置。