Skip to content

Commit b985a3e

Browse files
committed
chore: support KubernetesInformers annotation on bean constructor
1 parent bef3b24 commit b985a3e

File tree

3 files changed

+51
-37
lines changed

3 files changed

+51
-37
lines changed

spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer;
2222
import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformers;
2323
import io.kubernetes.client.util.generic.GenericKubernetesApi;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
2426
import org.springframework.beans.BeansException;
2527
import org.springframework.beans.factory.BeanFactory;
28+
import org.springframework.beans.factory.BeanFactoryAware;
2629
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2730
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2831
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -41,16 +44,17 @@
4144
* injects informers to spring context with the underlying constructing process hidden from users.
4245
*/
4346
public class KubernetesInformerFactoryProcessor
44-
implements BeanDefinitionRegistryPostProcessor, Ordered {
47+
implements BeanDefinitionRegistryPostProcessor, BeanFactoryAware, Ordered {
48+
49+
private static final Logger log = LoggerFactory.getLogger(KubernetesInformerFactoryProcessor.class);
4550

4651
public static final int ORDER = 0;
4752

4853
private ConfigurableListableBeanFactory beanFactory;
4954

5055
@Override
5156
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
52-
throws BeansException {
53-
this.beanFactory = beanFactory;
57+
throws BeansException {
5458
}
5559

5660
@Override
@@ -65,15 +69,22 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
6569
return;
6670
}
6771
for (String name : registry.getBeanDefinitionNames()) {
72+
KubernetesInformers kubernetesInformers = null;
6873
Class<?> cls = ((BeanFactory) registry).getType(name);
6974
if (cls != null) {
70-
KubernetesInformers kubernetesInformers =
71-
AnnotatedElementUtils.getMergedAnnotation(cls, KubernetesInformers.class);
72-
if (kubernetesInformers != null && kubernetesInformers.value().length > 0) {
73-
for (KubernetesInformer kubernetesInformer : kubernetesInformers.value()) {
74-
registerInformer(registry, kubernetesInformer);
75-
registerLister(registry, kubernetesInformer);
76-
}
75+
kubernetesInformers =
76+
AnnotatedElementUtils.getMergedAnnotation(cls, KubernetesInformers.class);
77+
}
78+
if (kubernetesInformers == null) {
79+
kubernetesInformers = beanFactory.findAnnotationOnBean(name, KubernetesInformers.class);
80+
}
81+
if (kubernetesInformers == null) {
82+
continue;
83+
}
84+
if (kubernetesInformers.value().length > 0) {
85+
for (KubernetesInformer kubernetesInformer : kubernetesInformers.value()) {
86+
registerInformer(registry, kubernetesInformer);
87+
registerLister(registry, kubernetesInformer);
7788
}
7889
}
7990
}
@@ -127,14 +138,19 @@ private <T extends KubernetesObject> SharedInformer<T> informer(
127138
final GenericKubernetesApi api =
128139
new GenericKubernetesApi(
129140
kubernetesInformer.apiTypeClass(),
130-
kubernetesInformer.apiListTypeClass(),
131-
kubernetesInformer.groupVersionResource().apiGroup(),
132-
kubernetesInformer.groupVersionResource().apiVersion(),
133-
kubernetesInformer.groupVersionResource().resourcePlural(),
134-
apiClient);
141+
kubernetesInformer.apiListTypeClass(),
142+
kubernetesInformer.groupVersionResource().apiGroup(),
143+
kubernetesInformer.groupVersionResource().apiVersion(),
144+
kubernetesInformer.groupVersionResource().resourcePlural(),
145+
apiClient);
135146
SharedIndexInformer<T> sharedIndexInformer =
136-
sharedInformerFactory.sharedIndexInformerFor(
137-
api, type, kubernetesInformer.resyncPeriodMillis(), kubernetesInformer.namespace());
147+
sharedInformerFactory.sharedIndexInformerFor(
148+
api, type, kubernetesInformer.resyncPeriodMillis(), kubernetesInformer.namespace());
138149
return sharedIndexInformer;
139150
}
151+
152+
@Override
153+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
154+
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
155+
}
140156
}

spring/src/main/java/io/kubernetes/client/spring/extended/controller/annotation/KubernetesInformers.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer} onto one bean
2727
* method.
2828
*/
29-
@Target({ElementType.TYPE})
29+
@Target({ElementType.TYPE, ElementType.METHOD})
3030
@Retention(RetentionPolicy.RUNTIME)
3131
public @interface KubernetesInformers {
3232

spring/src/test/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerCreatorTest.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,25 @@ public ApiClient testingApiClient() {
6666
}
6767

6868
@Bean
69-
public TestSharedInformerFactory testSharedInformerFactory() {
70-
return new TestSharedInformerFactory();
71-
}
72-
7369
@KubernetesInformers({
74-
@KubernetesInformer(
75-
apiTypeClass = V1Pod.class,
76-
apiListTypeClass = V1PodList.class,
77-
groupVersionResource =
78-
@GroupVersionResource(apiGroup = "", apiVersion = "v1", resourcePlural = "pods")),
79-
@KubernetesInformer(
80-
apiTypeClass = V1ConfigMap.class,
81-
apiListTypeClass = V1ConfigMapList.class,
82-
namespace = "default",
83-
groupVersionResource =
84-
@GroupVersionResource(
85-
apiGroup = "",
86-
apiVersion = "v1",
87-
resourcePlural = "configmaps")),
70+
@KubernetesInformer(
71+
apiTypeClass = V1Pod.class,
72+
apiListTypeClass = V1PodList.class,
73+
groupVersionResource =
74+
@GroupVersionResource(apiGroup = "", apiVersion = "v1", resourcePlural = "pods")),
75+
@KubernetesInformer(
76+
apiTypeClass = V1ConfigMap.class,
77+
apiListTypeClass = V1ConfigMapList.class,
78+
namespace = "default",
79+
groupVersionResource =
80+
@GroupVersionResource(
81+
apiGroup = "",
82+
apiVersion = "v1",
83+
resourcePlural = "configmaps")),
8884
})
89-
static class TestSharedInformerFactory {}
85+
public SharedInformerFactory testSharedInformerFactory() {
86+
return new SharedInformerFactory();
87+
}
9088
}
9189

9290
@Autowired private SharedInformerFactory informerFactory;

0 commit comments

Comments
 (0)