Java 无弹簧护套的弹簧护套执行器
我一直在开发Spring/SpringMVC应用程序,我希望添加性能指标。我遇到了弹簧启动执行器,它看起来像一个伟大的解决方案。但是,我的应用程序不是Spring引导应用程序。我的应用程序运行在传统的容器Tomcat8中 我添加了以下依赖项Java 无弹簧护套的弹簧护套执行器,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我一直在开发Spring/SpringMVC应用程序,我希望添加性能指标。我遇到了弹簧启动执行器,它看起来像一个伟大的解决方案。但是,我的应用程序不是Spring引导应用程序。我的应用程序运行在传统的容器Tomcat8中 我添加了以下依赖项 // Spring Actuator compile "org.springframework.boot:spring-boot-starter-actuator:1.2.3.RELEASE" 我创建了以下配置类 @EnableConfigurationP
// Spring Actuator
compile "org.springframework.boot:spring-boot-starter-actuator:1.2.3.RELEASE"
我创建了以下配置类
@EnableConfigurationProperties
@Configuration
@EnableAutoConfiguration
@Profile(value = {"dev", "test"})
@Import(EndpointAutoConfiguration.class)
public class SpringActuatorConfig {
}
我甚至在每个配置类上添加了
@EnableConfigurationProperties
,正如StackOverflow上的另一篇文章所建议的那样。然而,这并没有起到任何作用。端点仍然没有被创建,返回404。如果您想使用插入其中的组件,您需要将应用程序转换为Spring Boot。在下面有一个名为Convert a existing application to Spring Boot的部分,您需要查看该部分。我自己并没有这样做,但我使用Spring Boot,它的配置相对简单,所以希望您可以从这里获得它。首先让我们澄清一下,如果不使用Spring Boot,您就不能使用Spring Boot执行器
我错了,没有弹簧靴就不能穿。见@stefaan neyts
回答一个如何做的例子
我创建了一个示例项目来展示如何使用最少的Spring引导自动配置来转换基本的SpringMVC应用程序
原始资料来源:
转换源:
我本可以完全删除dispatcher-servlet.xml和web.xml文件,但我保留它们是为了展示如何尽可能少地执行更改,并简化转换更复杂的项目
下面是我转换的步骤列表
转换过程
- 添加带有@SpringBootApplication注释的Java配置文件
- 将应用程序配置文件作为bean添加到传统的xml配置中(在上下文扫描之后添加)
- 将视图解析器移动到应用程序java配置中 或者,将前缀和后缀添加到application.properties。 然后,您可以在应用程序中向它们注入@Value,或者完全删除它,只需使用提供的spring启动视图解析器即可。 我和前者一起去的
- 从spring上下文xml中删除了默认上下文侦听器 这很重要! 由于SpringBoot将提供一个异常,如果不提供,您将得到一个“errorlistenerstart”异常
- 将spring引导插件添加到构建脚本依赖项中(我使用的是gradle)
- 将mainClassName属性添加到生成文件中,并设置为空字符串(表示不创建可执行文件)
- 修改弹簧启动执行器的依赖项
- 虽然答案已经被接受,但我想更新我的经验。我不想使用
@SpringBootApplication
将我的应用程序转换为spring引导。请参阅我提到的最低要求代码 尽管在没有Spring Boot的情况下使用Spring Boot功能不是一个好主意,但这是可能的
例如,此Java配置使Spring Boot执行器指标在不使用Spring Boot的情况下可用:
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration;
import org.springframework.boot.actuate.endpoint.MetricsEndpoint;
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ EndpointAutoConfiguration.class, PublicMetricsAutoConfiguration.class })
public class SpringBootActuatorConfig {
@Bean
@Autowired
public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) {
return new EndpointHandlerMapping(endpoints);
}
@Bean
@Autowired
public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) {
return new EndpointMvcAdapter(delegate);
}
}
import java.util.Collection;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
导入org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration;
导入org.springframework.boot.actuate.endpoint.MetricsEndpoint;
导入org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
导入org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
导入org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.context.annotation.import;
@配置
@导入({EndpointAutoConfiguration.class,PublicMetricsAutoConfiguration.class})
公共类SpringBootActuatorConfig{
@豆子
@自动连线
公共端点HandlerMapping端点HandlerMapping(集合您可以在不使用spring引导的情况下使用执行器。
将其添加到pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
org.springframework.boot
< p>您没有在代码中引入@ prgBoog注释,但当您添加@ Spring BooGOT时,编译器将自动考虑为引导程序,并为它和您的执行器依赖文件< P>添加所需的依赖文件,因为我们已经有了Spring Bug Stor 2。x,将执行器包含到E中的配方。现有的Spring MVC项目可以如下所示:
@Configuration
@Import({
EndpointAutoConfiguration.class,
HealthIndicatorAutoConfiguration.class,
InfoEndpointAutoConfiguration.class,
HealthEndpointAutoConfiguration.class,
WebEndpointAutoConfiguration.class,
ServletManagementContextAutoConfiguration.class,
ManagementContextAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
class ActuatorConfiguration {
@Bean //taken from WebMvcEndpointManagementContextConfiguration.class
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
WebEndpointProperties webEndpointProperties) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
corsProperties.toCorsConfiguration(),
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
}
@Bean
DispatcherServletPath dispatcherServletPath() {
return () -> "/";
}
}
@配置
@进口({
EndpointAutoConfiguration.class,
HealthIndicatorAutoConfiguration.class,
InfoEndpointAutoConfiguration.class,
HealthEndpointAutoConfiguration.class,
WebEndpointAutoConfiguration.class,
ServletManagementContextAutoConfiguration.class,
ManagementContextAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
类促动器配置{
@Bean//取自WebMvcEndpointManagementContextConfiguration.class
公共WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsApplication WebEndpointsApplication,
ServletEndpoints应用程序ServletEndpoints应用程序,ControllerEndpoints应用程序ControllerEndpoints应用程序,
EndpointMediaTypes EndpointMediaTypes,CorsEndpointProperties corsProperties,
WebEndpointProperties(WebEndpointProperties){
列表您可能已经知道了这一点,但是您也可以将spring boot用于打包为war的应用程序;boot不要求您使用嵌入式tomcatI,我实际上对spring boot不太熟悉
@Configuration
@EnableWebMvc
@Import({
EndpointAutoConfiguration.class , PublicMetricsAutoConfiguration.class , HealthIndicatorAutoConfiguration.class
})
public class MyActuatorConfig {
@Bean
@Autowired
public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) {
return new EndpointHandlerMapping(endpoints);
}
@Bean
@Autowired
public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) {
return new EndpointMvcAdapter(delegate);
}
}
@Configuration
@Import({
EndpointAutoConfiguration.class,
HealthIndicatorAutoConfiguration.class,
InfoEndpointAutoConfiguration.class,
HealthEndpointAutoConfiguration.class,
WebEndpointAutoConfiguration.class,
ServletManagementContextAutoConfiguration.class,
ManagementContextAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
class ActuatorConfiguration {
@Bean //taken from WebMvcEndpointManagementContextConfiguration.class
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
WebEndpointProperties webEndpointProperties) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
corsProperties.toCorsConfiguration(),
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
}
@Bean
DispatcherServletPath dispatcherServletPath() {
return () -> "/";
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId>
<version>2.1.18.RELEASE</version>
</dependency>