Skip to content

Commit a5f7656

Browse files
committed
Remove the use of a FactoryBean when auto-configuring VirtualThreadMetrics
See gh-43956 Signed-off-by: Dmytro Nosan <[email protected]>
1 parent ec94e07 commit a5f7656

File tree

1 file changed

+12
-46
lines changed

1 file changed

+12
-46
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java

Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19-
import java.io.Closeable;
20-
2119
import io.micrometer.core.instrument.MeterRegistry;
20+
import io.micrometer.core.instrument.binder.MeterBinder;
2221
import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
2322
import io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics;
2423
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
@@ -32,8 +31,6 @@
3231
import org.springframework.aot.hint.RuntimeHintsRegistrar;
3332
import org.springframework.beans.BeanUtils;
3433
import org.springframework.beans.factory.BeanClassLoaderAware;
35-
import org.springframework.beans.factory.DisposableBean;
36-
import org.springframework.beans.factory.FactoryBean;
3734
import org.springframework.boot.autoconfigure.AutoConfiguration;
3835
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3936
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -53,10 +50,17 @@
5350
@AutoConfiguration(after = { MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class })
5451
@ConditionalOnClass(MeterRegistry.class)
5552
@ConditionalOnBean(MeterRegistry.class)
56-
public class JvmMetricsAutoConfiguration {
53+
public class JvmMetricsAutoConfiguration implements BeanClassLoaderAware {
5754

5855
private static final String VIRTUAL_THREAD_METRICS_CLASS = "io.micrometer.java21.instrument.binder.jdk.VirtualThreadMetrics";
5956

57+
private ClassLoader beanClassLoader;
58+
59+
@Override
60+
public void setBeanClassLoader(ClassLoader classLoader) {
61+
this.beanClassLoader = classLoader;
62+
}
63+
6064
@Bean
6165
@ConditionalOnMissingBean
6266
public JvmGcMetrics jvmGcMetrics() {
@@ -103,47 +107,9 @@ public JvmCompilationMetrics jvmCompilationMetrics() {
103107
@ConditionalOnClass(name = VIRTUAL_THREAD_METRICS_CLASS)
104108
@ConditionalOnMissingBean(type = VIRTUAL_THREAD_METRICS_CLASS)
105109
@ImportRuntimeHints(VirtualThreadMetricsRuntimeHintsRegistrar.class)
106-
VirtualThreadMetricsFactoryBean virtualThreadMetrics() {
107-
return new VirtualThreadMetricsFactoryBean();
108-
}
109-
110-
static final class VirtualThreadMetricsFactoryBean
111-
implements FactoryBean<Object>, BeanClassLoaderAware, DisposableBean {
112-
113-
private ClassLoader classLoader;
114-
115-
private Class<?> instanceType;
116-
117-
private Object instance;
118-
119-
@Override
120-
public void setBeanClassLoader(ClassLoader classLoader) {
121-
this.classLoader = classLoader;
122-
}
123-
124-
@Override
125-
public Object getObject() {
126-
if (this.instance == null) {
127-
this.instance = BeanUtils.instantiateClass(getObjectType());
128-
}
129-
return this.instance;
130-
}
131-
132-
@Override
133-
public Class<?> getObjectType() {
134-
if (this.instanceType == null) {
135-
this.instanceType = ClassUtils.resolveClassName(VIRTUAL_THREAD_METRICS_CLASS, this.classLoader);
136-
}
137-
return this.instanceType;
138-
}
139-
140-
@Override
141-
public void destroy() throws Exception {
142-
if (this.instance instanceof Closeable closeable) {
143-
closeable.close();
144-
}
145-
}
146-
110+
MeterBinder virtualThreadMetrics() {
111+
Class<?> clazz = ClassUtils.resolveClassName(VIRTUAL_THREAD_METRICS_CLASS, this.beanClassLoader);
112+
return (MeterBinder) BeanUtils.instantiateClass(clazz);
147113
}
148114

149115
static final class VirtualThreadMetricsRuntimeHintsRegistrar implements RuntimeHintsRegistrar {

0 commit comments

Comments
 (0)