-
Notifications
You must be signed in to change notification settings - Fork 39
io microsphere spring beans factory support ListenableAutowireCandidateResolver
Type: Class | Module: microsphere-spring-context | Package: io.microsphere.spring.beans.factory.support | Since: 1.0.0
A decorator implementation of AutowireCandidateResolver that allows listening to the autowire candidate
resolution process via AutowireCandidateResolvingListener.
This class enables enhanced visibility into the Spring dependency resolution mechanism by allowing external listeners to observe and react to events during autowiring. It wraps the original resolver and delegates all calls to it while notifying registered listeners about various resolution stages.
- Wraps the existing `AutowireCandidateResolver` in a Spring bean factory
- Supports dynamic registration of resolving listeners based on Spring Beans or Spring Factories
- Provides lifecycle integration through `BeanFactoryPostProcessor`
Enable the resolver using property configuration:
`microsphere.spring.listenable-autowire-candidate-resolver.enabled=true `
public class ListenableAutowireCandidateResolver implements AutowireCandidateResolver, BeanFactoryPostProcessor,Author: Mercy
-
Introduced in:
1.0.0 -
Current Project Version:
0.2.32-SNAPSHOT
This component is tested and compatible with the following Java versions:
| Java Version | Status |
|---|---|
| Java 17 | ✅ Compatible |
| Java 21 | ✅ Compatible |
| Java 25 | ✅ Compatible |
microsphere.spring.listenable-autowire-candidate-resolver.enabled=trueListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
resolver.addListener(new LoggingAutowireCandidateResolvingListener());ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
AutowireCandidateResolvingListener[] listeners = new AutowireCandidateResolvingListener[]{
new LoggingAutowireCandidateResolvingListener()
};
resolver.addListeners(listeners);ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
List<AutowireCandidateResolvingListener> listeners = new ArrayList<>();
listeners.add(new LoggingAutowireCandidateResolvingListener());
resolver.addListeners(listeners);ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
Field field = findField(MyService.class, "testBean");
DependencyDescriptor descriptor = new DependencyDescriptor(field, true);
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, "testBean");
boolean candidate = resolver.isAutowireCandidate(holder, descriptor);// A listener that captures the resolved suggested value for @Value fields:
public void suggestedValueResolved(DependencyDescriptor descriptor, Object suggestedValue) {
if (descriptor.getAnnotation(Value.class) != null && suggestedValue instanceof String) {
String resolved = environment.resolvePlaceholders((String) suggestedValue);
}
}// An @Lazy-annotated field will trigger lazy proxy creation:
@Autowired
@Qualifier("testBean")
@Lazy
private TestBean testBean;
// The resolver returns a proxy that defers actual bean resolution// Typically invoked automatically by Spring during context initialization.
// After postProcessBeanFactory, the resolver is installed in the bean factory:
ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
AutowireCandidateResolver actual = beanFactory.getAutowireCandidateResolver();
assertSame(actual, resolver);Add the following dependency to your pom.xml:
<dependency>
<groupId>io.github.microsphere-projects</groupId>
<artifactId>microsphere-spring-context</artifactId>
<version>${microsphere-spring.version}</version>
</dependency>Tip: Use the BOM (
microsphere-spring-dependencies) for consistent version management. See the Getting Started guide.
import io.microsphere.spring.beans.factory.support.ListenableAutowireCandidateResolver;| Method | Description |
|---|---|
addListener |
Adds one or more AutowireCandidateResolvingListener instances to this resolver. |
addListeners |
Adds an array of AutowireCandidateResolvingListener instances to this resolver. |
addListeners |
Adds a list of AutowireCandidateResolvingListener instances to this resolver. |
isAutowireCandidate |
{@inheritDoc} |
isRequired |
{@inheritDoc} |
hasQualifier |
{@inheritDoc} |
getSuggestedValue |
{@inheritDoc} |
getLazyResolutionProxyIfNecessary |
{@inheritDoc} |
cloneIfNecessary |
{@inheritDoc} |
postProcessBeanFactory |
{@inheritDoc} |
setBeanName |
|
wrap |
Wraps AutowireCandidateResolver as the ListenableAutowireCandidateResolver and then register to |
public void addListener(AutowireCandidateResolvingListener one, AutowireCandidateResolvingListener... more)Adds one or more AutowireCandidateResolvingListener instances to this resolver.
The first listener is required; additional listeners are optional.
`ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable(); resolver.addListener(new LoggingAutowireCandidateResolvingListener()); `
public void addListeners(AutowireCandidateResolvingListener[] listeners)Adds an array of AutowireCandidateResolvingListener instances to this resolver.
`ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
AutowireCandidateResolvingListener[] listeners = new AutowireCandidateResolvingListener[]{
new LoggingAutowireCandidateResolvingListener()
`;
resolver.addListeners(listeners);
}
public void addListeners(List<AutowireCandidateResolvingListener> listeners)Adds a list of AutowireCandidateResolvingListener instances to this resolver.
`ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable(); List listeners = new ArrayList<>(); listeners.add(new LoggingAutowireCandidateResolvingListener()); resolver.addListeners(listeners); `
public boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor){@inheritDoc}
Delegates to the wrapped AutowireCandidateResolver to determine whether
the given bean definition qualifies as an autowire candidate for the specified descriptor.
`ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable(); Field field = findField(MyService.class, "testBean"); DependencyDescriptor descriptor = new DependencyDescriptor(field, true); BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, "testBean"); boolean candidate = resolver.isAutowireCandidate(holder, descriptor); `
public Object getSuggestedValue(DependencyDescriptor descriptor){@inheritDoc}
Delegates to the wrapped AutowireCandidateResolver to obtain the suggested value
for the given dependency descriptor, then notifies all registered
AutowireCandidateResolvingListener listeners via
AutowireCandidateResolvingListener#suggestedValueResolved(DependencyDescriptor, Object).
`// A listener that captures the resolved suggested value for @Value fields:
public void suggestedValueResolved(DependencyDescriptor descriptor, Object suggestedValue) {
if (descriptor.getAnnotation(Value.class) != null && suggestedValue instanceof String) {
String resolved = environment.resolvePlaceholders((String) suggestedValue);
`
}
}
public Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, String beanName){@inheritDoc}
Delegates to the wrapped AutowireCandidateResolver to obtain a lazy resolution proxy
if needed for the given dependency descriptor, then notifies all registered
AutowireCandidateResolvingListener listeners via
AutowireCandidateResolvingListener#lazyProxyResolved(DependencyDescriptor, String, Object).
{@code
// An @Lazy-annotated field will trigger lazy proxy creation:
#### `postProcessBeanFactory`
```java
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
```
{@inheritDoc}
Wraps the `AutowireCandidateResolver` of the given `ConfigurableListableBeanFactory`
with this listenable resolver during the `BeanFactoryPostProcessor` lifecycle.
### Example Usage
`// Typically invoked automatically by Spring during context initialization.
// After postProcessBeanFactory, the resolver is installed in the bean factory:
ListenableAutowireCandidateResolver resolver = resolverProvider.getIfAvailable();
AutowireCandidateResolver actual = beanFactory.getAutowireCandidateResolver();
assertSame(actual, resolver);
`
public void wrap(BeanFactory beanFactory)
Wraps AutowireCandidateResolver as the ListenableAutowireCandidateResolver and then register to
the given DefaultListableBeanFactory
AutowireCandidateResolverAutowireCandidateResolvingListenerCompositeAutowireCandidateResolvingListenerDefaultListableBeanFactory#setAutowireCandidateResolver(AutowireCandidateResolver)BeanFactoryPostProcessor
This documentation was auto-generated from the source code of microsphere-spring.
spring-context
- AbstractInjectionPointDependencyResolver
- AbstractSmartLifecycle
- AbstractSpringResourceURLConnection
- AnnotatedBeanCapableImportBeanDefinitionRegistrar
- AnnotatedBeanCapableImportCandidate
- AnnotatedBeanCapableImportSelector
- AnnotatedBeanDefinitionRegistryUtils
- AnnotatedInjectionBeanPostProcessor
- AnnotatedInjectionPointDependencyResolver
- AnnotatedPropertySourceLoader
- AnnotationBeanDefinitionRegistryPostProcessor
- AnnotationUtils
- ApplicationContextUtils
- ApplicationEventInterceptor
- ApplicationEventInterceptorChain
- ApplicationListenerInterceptor
- ApplicationListenerInterceptorChain
- AutoRegistrationBean
- AutoRegistrationBeanInitializer
- AutoRegistrationBeanRegistrar
- AutowireCandidateResolvingListener
- AutowiredInjectionPointDependencyResolver
- BeanCapableImportCandidate
- BeanDefinitionUtils
- BeanDependencyResolver
- BeanFactoryListener
- BeanFactoryListenerAdapter
- BeanFactoryListeners
- BeanFactoryUtils
- BeanListener
- BeanListenerAdapter
- BeanListeners
- BeanMethodInjectionPointDependencyResolver
- BeanPropertyChangedEvent
- BeanRegistrar
- BeanSource
- BeanTimeStatistics
- BeanUtils
- CollectingConfigurationPropertyListener
- CompositeAutowireCandidateResolvingListener
- ConfigurableApplicationContextInitializer
- ConfigurationBeanAliasGenerator
- ConfigurationBeanBinder
- ConfigurationBeanBindingPostProcessor
- ConfigurationBeanBindingRegistrar
- ConfigurationBeanBindingsRegister
- ConfigurationBeanCustomizer
- ConfigurationPropertyOverrideAnnotationAttributesStrategy
- ConfigurationPropertyRepository
- ConstructionInjectionPointDependencyResolver
- ConversionServiceResolver
- ConversionServiceUtils
- DefaultApplicationEventInterceptorChain
- DefaultApplicationListenerInterceptorChain
- DefaultBeanDependencyResolver
- DefaultConfigurationBeanAliasGenerator
- DefaultConfigurationBeanBinder
- DefaultPropertiesPropertySource
- DefaultPropertiesPropertySourceLoader
- DefaultPropertiesPropertySources
- DefaultPropertiesPropertySourcesLoader
- DefaultResourceComparator
- DelegatingFactoryBean
- Dependency
- DependencyAnalysisBeanFactoryListener
- DependencyTreeWalker
- EnableAutoRegistrationBean
- EnableConfigurationBeanBinding
- EnableConfigurationBeanBindings
- EnableEventExtension
- EnableSpringConverterAdapter
- EnableSpringConverterAdapterRegistrar
- EnableTTLCaching
- EnvironmentEnabled
- EnvironmentListener
- EnvironmentUtils
- EventExtensionAttributes
- EventExtensionRegistrar
- EventPublishingBeanAfterProcessor
- EventPublishingBeanBeforeProcessor
- EventPublishingBeanInitializer
- ExposingClassPathBeanDefinitionScanner
- FilterMode
- GenericAnnotationAttributes
- GenericApplicationListenerAdapter
- GenericBeanNameGenerator
- GenericBeanPostProcessorAdapter
- HyphenAliasGenerator
- ImmutableMapPropertySource
- ImportOptional
- ImportOptionalSelector
- InjectionPointDependencyResolver
- InjectionPointDependencyResolvers
- InterceptingApplicationEventMulticaster
- InterceptingApplicationEventMulticasterProxy
- InterceptingApplicationListener
- JavaBeansPropertyChangeListenerAdapter
- JoinAliasGenerator
- JsonPropertySource
- JsonPropertySourceFactory
- ListenableAutowireCandidateResolver
- ListenableAutowireCandidateResolverInitializer
- ListenableConfigurableEnvironment
- ListenableConfigurableEnvironmentInitializer
- LoggingAutowireCandidateResolvingListener
- LoggingBeanFactoryListener
- LoggingBeanListener
- LoggingEnvironmentListener
- LoggingSmartLifecycle
- MethodParameterUtils
- MimeTypeUtils
- NamedBeanHolderComparator
- OnceApplicationContextEventListener
- OverrideAnnotationAttributes
- OverrideAnnotationAttributesStrategy
- ParallelPreInstantiationSingletonsBeanFactoryListener
- ProfileListener
- PropertiesUtils
- PropertyConstants
- PropertyResolverListener
- PropertyResolverUtils
- PropertySourceChangedEvent
- PropertySourceExtension
- PropertySourceExtensionAttributes
- PropertySourceExtensionLoader
- PropertySourcesChangedEvent
- PropertySourcesUtils
- PropertyValuesUtils
- ResolvableDependencyTypeFilter
- ResolvablePlaceholderAnnotationAttributes
- ResourceInjectionPointDependencyResolver
- ResourceLoaderUtils
- ResourcePropertySource
- ResourcePropertySourceLoader
- ResourcePropertySources
- ResourcePropertySourcesLoader
- ResourceUtils
- ResourceYamlProcessor
- SpringConverterAdapter
- SpringDelegatingBeanProtocolURLConnectionFactory
- SpringEnvironmentURLConnectionFactory
- SpringFactoriesLoaderUtils
- SpringProfilesURLConnectionAdapter
- SpringPropertySourcesURLConnectionAdapter
- SpringProtocolURLStreamHandler
- SpringResourceURLConnection
- SpringResourceURLConnectionAdapter
- SpringResourceURLConnectionFactory
- SpringSubProtocolURLConnectionFactory
- SpringVersion
- SpringVersionUtils
- TTLCachePut
- TTLCacheResolver
- TTLCacheable
- TTLCachingConfiguration
- TTLContext
- UnderScoreJoinAliasGenerator
- YamlPropertySource
- YamlPropertySourceFactory
spring-guice
spring-jdbc
- CompoundJdbcEventListenerFactory
- EnableP6DataSource
- NoOpP6LoadableOptions
- P6DataSourceBeanDefinitionRegistrar
- P6DataSourceBeanPostProcessor
- PropertySourcesP6LoadableOptionsAdapter
- SpringP6SpyURLConnectionFactory
spring-test
- AbstractWebFluxTest
- AbstractWebMvcTest
- AnnotatedTypeMetadataTestFactory
- EmbeddedDataBaseBeanDefinitionRegistrar
- EmbeddedDataBaseBeanDefinitionsRegistrar
- EmbeddedDatabaseType
- EmbeddedTomcatConfiguration
- EmbeddedTomcatContextLoader
- EmbeddedTomcatMergedContextConfiguration
- EmbeddedTomcatTestContextBootstrapper
- EmbeddedZookeeperServer
- EmbeddedZookeeperServerTestExecutionListener
- EnableEmbeddedDatabase
- EnableEmbeddedDatabases
- MockServletWebRequest
- PersonHandler
- PersonHandler
- RouterFunctionTestConfig
- RouterFunctionTestConfig
- ServletTestUtils
- SimpleUrlHandlerMappingTestConfig
- SimpleUrlHandlerMappingTestConfig
- SpringLoggingTest
- SpringTestUtils
- SpringTestWebUtils
- TestConditionContext
- TestController
- TestFilter
- TestFilterRegistration
- TestServlet
- TestServletContext
- TestServletContextListener
- TestServletRegistration
- User
- WebTestUtils
spring-web
- AbstractNameValueExpression
- AbstractWebEndpointMappingFactory
- AbstractWebRequestRule
- CompositeWebEndpointMappingRegistry
- CompositeWebRequestRule
- ConsumeMediaTypeExpression
- DelegatingHandlerMethodAdvice
- EnableWebExtension
- FilterRegistrationWebEndpointMappingFactory
- FilteringWebEndpointMappingRegistry
- GenericMediaTypeExpression
- HandlerMetadata
- HandlerMethodAdvice
- HandlerMethodArgumentInterceptor
- HandlerMethodArgumentsResolvedEvent
- HandlerMethodInterceptor
- HandlerMethodMetadata
- HttpUtils
- Jackson2WebEndpointMappingFactory
- MediaTypeExpression
- MediaTypeUtils
- NameValueExpression
- ProduceMediaTypeExpression
- PropertyConstants
- RegistrationWebEndpointMappingFactory
- RequestAttributesUtils
- RequestContextStrategy
- ServletRegistrationWebEndpointMappingFactory
- ServletWebEndpointMappingResolver
- SimpleWebEndpointMappingRegistry
- SmartWebEndpointMappingFactory
- SpringWebHelper
- SpringWebType
- UnknownSpringWebHelper
- WebEndpointMapping
- WebEndpointMappingFactory
- WebEndpointMappingFilter
- WebEndpointMappingRegistrar
- WebEndpointMappingRegistry
- WebEndpointMappingResolver
- WebEndpointMappingsReadyEvent
- WebEventPublisher
- WebExtensionBeanDefinitionRegistrar
- WebRequestConsumesRule
- WebRequestHeaderExpression
- WebRequestHeadersRule
- WebRequestMethodsRule
- WebRequestParamExpression
- WebRequestParamsRule
- WebRequestPattensRule
- WebRequestProducesRule
- WebRequestRule
- WebRequestUtils
- WebScope
- WebSource
- WebTarget
- WebType
- WebUtils
spring-webflux
- CompositeWebFilter
- ConsumingWebEndpointMappingAdapter
- DelegatingWebFilter
- EnableWebFluxExtension
- HandlerMappingWebEndpointMappingFactory
- HandlerMappingWebEndpointMappingResolver
- HandlerMetadataWebEndpointMappingFactory
- InterceptingHandlerMethodProcessor
- MonoUtils
- RequestContextWebFilter
- RequestHandledEventPublishingWebFilter
- RequestMappingMetadataWebEndpointMappingFactory
- RequestPredicateKind
- RequestPredicateVisitorAdapter
- ReversedProxyHandlerMapping
- RouterFunctionVisitorAdapter
- ServerRequestHandledEvent
- ServerWebRequest
- SpringWebFluxHelper
- StoringRequestBodyArgumentInterceptor
- StoringResponseBodyReturnValueInterceptor
- WebFluxExtensionBeanDefinitionRegistrar
- WebServerScope
- WebServerUtils
spring-webmvc
- AbstractPageRenderContextHandlerInterceptor
- AnnotatedMethodHandlerInterceptor
- ConfigurableContentNegotiationManagerWebMvcConfigurer
- ConsumingWebEndpointMappingAdapter
- ContentCachingFilter
- EnableWebMvcExtension
- EnableWebMvcExtensionListener
- ExclusiveViewResolverApplicationListener
- HandlerMappingWebEndpointMappingFactory
- HandlerMappingWebEndpointMappingResolver
- HandlerMetadataWebEndpointMappingFactory
- HandlerMethodArgumentResolverAdvice
- InterceptingHandlerMethodProcessor
- LazyCompositeHandlerInterceptor
- LoggingHandlerMethodArgumentResolverAdvice
- LoggingMethodHandlerInterceptor
- LoggingPageRenderContextHandlerInterceptor
- MethodHandlerInterceptor
- PropertyConstants
- RequestBodyAdviceAdapter
- RequestMappingMetadata
- RequestMappingMetadataWebEndpointMappingFactory
- RequestPredicateVisitorAdapter
- ResponseBodyAdviceAdapter
- ReversedProxyHandlerMapping
- RouterFunctionVisitorAdapter
- SpringWebMvcHelper
- StoringRequestBodyArgumentAdvice
- StoringResponseBodyReturnValueAdvice
- ViewResolverUtils
- ViewUtils
- WebMvcExtensionBeanDefinitionRegistrar
- WebMvcExtensionConfiguration
- WebMvcUtils
- WebUtils