Github user gavlyukovskiy commented on a diff in the pull request:
https://github.com/apache/incubator-griffin/pull/444#discussion_r231981734
--- Diff:
service/src/main/java/org/apache/griffin/core/event/GriffinEventListeners.java
---
@@ -0,0 +1,50 @@
+package org.apache.griffin.core.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Configuration
+public class GriffinEventListeners {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(GriffinEventListeners.class);
+
+ @Autowired
+ private ApplicationContext context;
+ @Value("#{'${internal.event.listeners}'.split(',')}")
+ private List<String> listeners;
+
+ @Bean
+ public List<GriffinHook> getListenersRegistered() {
--- End diff --
I see that you getting beans by names from the context, am I right that
you're trying to declare only beans that user has specified in the property? I
think it will not work, because `@Autowired List<GriffinHook> eventListeners`
will always inject all beans of given type from the context.
For example if you do:
```
@Bean
public static List<GriffinHook> list() {
return Arrays.asList(
new GriffinHook("1"),
new GriffinHook("2")
);
}
@Bean
public static GriffinHook hook3() {
return new GriffinHook("3");
}
@Autowired
private final List<GriffinHook> griffinHooks;
```
in this case spring will try to inject list of beans of given type - list
containing only `hook3`.
Instead I would propose to remove this bean declaration and make changes in
`GriffinEventManager` to get all beans from context and use only beans
specified in the config:
```
public class GriffinEventManager {
@Autowired
private ApplicationContext applicationContext;
@Value("#{'${internal.event.listeners}'.split(',')}")
private Set<String> enabledListeners;
private List<GriffinHook> eventListeners;
@PostConstruct
void initializeListeners() {
List<GriffinHook> eventListeners = new ArrayList<>();
applicationContext.getBeansOfType(GriffinHook.class)
.forEach((beanName, listener) -> {
if (enabledListeners.contains(beanName)) {
eventListeners.add(listener);
}
});
this.eventListeners = eventListeners;
}
...
}
```
---