当前位置: 首页 > 面试题库 >

多上下文spring-boot应用程序:如何为每个子上下文定义标准spring-boot属性

卫学真
2023-03-14
问题内容

关于添加多个tomcat连接器并将它们分别绑定到单独的控制器的能力,存在一个很好的问题。

安迪·威尔金森的好答案的实质在这里:

public static void main(String[] args) {
    SpringApplicationBuilder parentBuilder 
            = new SpringApplicationBuilder(ApplicationConfiguration.class);
    parentBuilder.child(ServiceOneConfiguration.class)
            .properties("server.port:8080").run(args);
    parentBuilder.child(ServiceTwoConfiguration.class)
            .properties("server.port:8081").run(args);      
}

我想再继续问一个问题:

有没有一种方法可以使每个子应用程序上下文在支持所有标准spring-boot功能(例如配置文件后缀文件名等)的情况下读取某些特定于子应用程序的属性。

具有三个单独的属性文件:

  • application.properties
  • child1.properties
  • child2.properties

并能够为每个上下文设置一个文件。

但是对我来说重要的是,它们必须支持所有的弹簧靴魔术。例如,如果我激活新的配置文件(如传递命令行参数)--spring.profiles.active=dev,那么不仅应该自动加载这三个文件(每个上下文一个),还应自动加载另一组文件(如果存在):

  • application-dev.properties
  • child1-dev.properties
  • child2-dev.properties

当然,这些文件应按定义顺序等在标准spring-boot的支持路径中搜索。

如果带有某些编码的框是否可能出来?

实现它的另一种假设方法

仅具有一个application.properties文件(支持配置文件等),但是以某种方式将前缀属性映射到子上下文的未前缀属性。

例:

child1.server.port=8081
child1.foo=bar
child2.server.port=8082
child2.foo=baz

第一个孩子上下文应该看到这些属性,就像它们只是:

server.port=8081
foo=bar

第二个子上下文应该看到这些属性,就像它们只是:

server.port=8082
foo=baz

因此,标准的spring-boot的自动配置将起作用并正确设置了tomcat的端口等。

我不是在寻找特定的方法(但是,如果您问我,我倾向于第二种方法),但是任何开箱即用的工作或可以用最少的方式进行的工作都可以满足我的要求。


问题答案:

您可以使用spring.config.name以下方法实现第一个建议:

public static void main(String[] args) {
    SpringApplicationBuilder parentBuilder =
            new SpringApplicationBuilder(ParentApplication.class)
                    .web(WebApplicationType.NONE);
    parentBuilder.run(args);
    parentBuilder.child(ServiceOneConfiguration.class)
            .properties("spring.config.name=child1").run(args);
    parentBuilder.child(ServiceTwoConfiguration.class)
            .properties("spring.config.name=child2").run(args);
}

然后child1{-profile}.properties,您可以分别使用和child2{-profile}.properties配置服务一和服务二。

例如,使用server.port=8081in child1.propertiesserver.port=8082in
child2.properties,在两个子服务中启动使用自动配置的应用程序时,您应该看到类似于以下内容的输出spring-boot-starter- web

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-01-22 13:38:09.690  INFO 80968 --- [           main] com.example.parent.ParentApplication     : Starting ParentApplication on …
2019-01-22 13:38:09.692  INFO 80968 --- [           main] com.example.parent.ParentApplication     : No active profile set, falling back to default profiles: default
2019-01-22 13:38:09.842  INFO 80968 --- [           main] com.example.parent.ParentApplication     : Started ParentApplication in 0.371 seconds (JVM running for 0.644)

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-01-22 13:38:10.046  INFO 80968 --- [           main] com.example.parent.ParentApplication     : No active profile set, falling back to default profiles: default
2019-01-22 13:38:10.584  INFO 80968 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2019-01-22 13:38:10.604  INFO 80968 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-01-22 13:38:10.605  INFO 80968 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-01-22 13:38:10.613  INFO 80968 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/awilkinson/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
2019-01-22 13:38:10.668  INFO 80968 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-01-22 13:38:10.668  INFO 80968 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 612 ms
2019-01-22 13:38:10.829  INFO 80968 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-22 13:38:10.981  INFO 80968 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2019-01-22 13:38:10.981  INFO 80968 --- [           main] com.example.parent.ParentApplication     : Started ParentApplication in 0.955 seconds (JVM running for 1.784)

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-01-22 13:38:11.003  INFO 80968 --- [           main] com.example.parent.ParentApplication     : No active profile set, falling back to default profiles: default
2019-01-22 13:38:11.093  INFO 80968 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
2019-01-22 13:38:11.095  INFO 80968 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-01-22 13:38:11.096  INFO 80968 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-01-22 13:38:11.100  INFO 80968 --- [           main] o.a.c.c.C.[Tomcat-1].[localhost].[/]     : Initializing Spring embedded WebApplicationContext
2019-01-22 13:38:11.101  INFO 80968 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 97 ms
2019-01-22 13:38:11.135  INFO 80968 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-22 13:38:11.164  INFO 80968 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2019-01-22 13:38:11.165  INFO 80968 --- [           main] com.example.parent.ParentApplication     : Started ParentApplication in 0.183 seconds (JVM running for 1.967)


 类似资料:
  • 添加多个tomcat连接器并将其绑定到每个单独的控制器的能力有一个很好的问题。 安迪·威尔金森好答案的精髓在这里: 我想进一步问另一个问题: 有没有一种方法可以让每个子应用程序上下文在支持所有标准spring boot功能的情况下读取一些特定于子应用程序的属性,比如配置文件后缀文件名等。 有三个单独的属性文件: 并且能够为每个上下文设置一个文件。 但对我来说重要的是,他们必须支持所有的spring

  • 当前目录的Spring Boot多上下文问题 在Spring Boot文档应用程序属性文件中 null 在和模块的PluginContext中不可见,只能在中可见,因为它是root,但当前目录在哪里?当前目录是什么意思? 是否可以从自己的模块将包含到PluginContext中,而不需要其他配置(通过或外部配置)?

  • 我使用Spock框架和Groovy脚本来测试我的Java应用程序。对于我创建的所有类,我的项目有100%的测试覆盖率。然而,我注意到覆盖范围显示,名为“app”的主类没有得到充分测试。 这是我对App类的一个测试: 如何用Spock框架充分测试Spring Boot应用程序上下文?

  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 我正在尝试以编程方式设置一个spring boot应用程序上下文根。上下文根的原因是我们希望从访问应用程序,并将所有控制器路径附加到它。 下面是Web-App的应用程序配置文件。 这是主页面的索引控制器。 应用程序的新根应该位于,但它仍然位于。 我错过了什么导致spring boot没有在请求映射之前添加上下文根?

  • 我有一个相当简单的设置。一个包含3个模块的maven项目:core/webapp/model。我正在使用Spring boot来升级我的应用程序。在webapp中,我有一个简单的类WebappConfig如下: 当我部署abcd.war时,applicationcontext加载了两次,并导致以下错误stracktrace: 不存在我前面提到的web.xml。 一些有趣的事情,我不知道为什么: n

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • 我有一个作为WAR部署的spring boot web应用程序。现在,当我将它部署到我的Tomcat7服务器时,它使用war文件的名称作为上下文,例如/myArtifactid-1.5.4.snapshot/。我想指定上下文路径,但是 似乎只适用于嵌入式Tomcat。我添加了一个meta-inf/context.xml,其中仅包含以下内容 但这并没有起到任何作用。