From 0a89fa11b8568bc1e46b32e7130d59ea62222aaa Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Wed, 17 Mar 2021 20:16:51 +0800 Subject: [PATCH] chore: support KubernetesInformers annotation on bean constructor --- .../KubernetesInformerFactoryProcessor.java | 37 ++++++++++++------- .../annotation/KubernetesInformers.java | 2 +- .../KubernetesInformerCreatorTest.java | 8 ++-- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java b/spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java index ae456e0454..416819667c 100644 --- a/spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java +++ b/spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java @@ -21,12 +21,12 @@ import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer; import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformers; import io.kubernetes.client.spring.extended.controller.config.KubernetesInformerProperties; -import io.kubernetes.client.spring.extended.controller.factory.KubernetesControllerFactory; import io.kubernetes.client.util.generic.GenericKubernetesApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -46,11 +46,12 @@ * injects informers to spring context with the underlying constructing process hidden from users. */ public class KubernetesInformerFactoryProcessor - implements BeanDefinitionRegistryPostProcessor, Ordered { + implements BeanDefinitionRegistryPostProcessor, BeanFactoryAware, Ordered { - public static final int ORDER = 0; + private static final Logger log = + LoggerFactory.getLogger(KubernetesInformerFactoryProcessor.class); - private static final Logger log = LoggerFactory.getLogger(KubernetesControllerFactory.class); + public static final int ORDER = 0; @Autowired private KubernetesInformerProperties informerProperties; @@ -58,9 +59,7 @@ public class KubernetesInformerFactoryProcessor @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) - throws BeansException { - this.beanFactory = beanFactory; - } + throws BeansException {} @Override public int getOrder() { @@ -74,15 +73,22 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) return; } for (String name : registry.getBeanDefinitionNames()) { + KubernetesInformers kubernetesInformers = null; Class cls = ((BeanFactory) registry).getType(name); if (cls != null) { - KubernetesInformers kubernetesInformers = + kubernetesInformers = AnnotatedElementUtils.getMergedAnnotation(cls, KubernetesInformers.class); - if (kubernetesInformers != null && kubernetesInformers.value().length > 0) { - for (KubernetesInformer kubernetesInformer : kubernetesInformers.value()) { - registerInformer(registry, kubernetesInformer); - registerLister(registry, kubernetesInformer); - } + } + if (kubernetesInformers == null) { + kubernetesInformers = beanFactory.findAnnotationOnBean(name, KubernetesInformers.class); + } + if (kubernetesInformers == null) { + continue; + } + if (kubernetesInformers.value().length > 0) { + for (KubernetesInformer kubernetesInformer : kubernetesInformers.value()) { + registerInformer(registry, kubernetesInformer); + registerLister(registry, kubernetesInformer); } } } @@ -160,4 +166,9 @@ private SharedInformer informer( api, type, kubernetesInformer.resyncPeriodMillis(), kubernetesInformer.namespace()); return sharedIndexInformer; } + + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; + } } diff --git a/spring/src/main/java/io/kubernetes/client/spring/extended/controller/annotation/KubernetesInformers.java b/spring/src/main/java/io/kubernetes/client/spring/extended/controller/annotation/KubernetesInformers.java index 328c5246e7..f722f95b05 100644 --- a/spring/src/main/java/io/kubernetes/client/spring/extended/controller/annotation/KubernetesInformers.java +++ b/spring/src/main/java/io/kubernetes/client/spring/extended/controller/annotation/KubernetesInformers.java @@ -26,7 +26,7 @@ * io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer} onto one bean * method. */ -@Target({ElementType.TYPE}) +@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface KubernetesInformers { diff --git a/spring/src/test/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerCreatorTest.java b/spring/src/test/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerCreatorTest.java index a340477e30..d9937e646a 100644 --- a/spring/src/test/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerCreatorTest.java +++ b/spring/src/test/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerCreatorTest.java @@ -66,10 +66,6 @@ public ApiClient testingApiClient() { } @Bean - public TestSharedInformerFactory testSharedInformerFactory() { - return new TestSharedInformerFactory(); - } - @KubernetesInformers({ @KubernetesInformer( apiTypeClass = V1Pod.class, @@ -86,7 +82,9 @@ public TestSharedInformerFactory testSharedInformerFactory() { apiVersion = "v1", resourcePlural = "configmaps")), }) - static class TestSharedInformerFactory {} + public SharedInformerFactory testSharedInformerFactory() { + return new SharedInformerFactory(); + } } @Autowired private SharedInformerFactory informerFactory;