diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/config/ExtensionRegisterBootstrap.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/config/ExtensionRegisterBootstrap.java index 1b523ad6..0dbae207 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/config/ExtensionRegisterBootstrap.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/config/ExtensionRegisterBootstrap.java @@ -21,6 +21,7 @@ import cn.hippo4j.common.extension.IExtension; import cn.hippo4j.common.extension.annotation.Realization; import cn.hippo4j.common.extension.support.ExtensionRegistry; import cn.hippo4j.common.toolkit.ClassUtil; +import org.springframework.aop.scope.ScopedProxyUtils; import org.springframework.beans.BeansException; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -28,6 +29,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Map; +import java.util.stream.Collectors; /** * Extension register bootstrap @@ -45,20 +47,15 @@ public class ExtensionRegisterBootstrap implements ApplicationContextAware, Appl @Override public void run(ApplicationArguments args) throws Exception { - - Map realizationBeanMap = applicationContext.getBeansWithAnnotation(Realization.class); - realizationBeanMap.values().forEach( - realization -> { - if (isInfrastructureClass(realization)) { - return; - } - if (realization instanceof IExtension) { - registry.register((IExtension) realization); - } - }); + applicationContext.getBeansWithAnnotation(Realization.class) + .entrySet().stream() + .filter(entry -> !filterClass(entry.getKey(), entry.getValue())) + .forEach(entry -> registry.register((IExtension) entry.getValue())); } - private boolean isInfrastructureClass(Object obj) { - return obj.getClass().isAssignableFrom(IExtension.class); + private boolean filterClass(String beanName, Object bean) { + return bean.getClass().isAssignableFrom(IExtension.class) || + ScopedProxyUtils.isScopedTarget(beanName) || + !(bean instanceof IExtension); } } diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AllMatch.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AllMatch.java index d4afa519..f1f37e7f 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AllMatch.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AllMatch.java @@ -41,11 +41,11 @@ public class AllMatch extends Reducer { @Override public Boolean reduce() { - if (CollectionUtil.isEmpty(extensionImplementations)) { + if (CollectionUtil.isEmpty(realizations)) { return false; } else { - for (IExtension extensionImpl : extensionImplementations) { - if (!predicate.test(getCallback().apply(extensionImpl))) { + for (IExtension realization : realizations) { + if (!predicate.test(getCallback().apply(realization))) { return false; } } diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AnyMatch.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AnyMatch.java index 7fa70a8e..66305b00 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AnyMatch.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/AnyMatch.java @@ -41,10 +41,10 @@ public class AnyMatch extends Reducer { @Override public Boolean reduce() { - if (CollectionUtil.isEmpty(extensionImplementations)) { + if (CollectionUtil.isEmpty(realizations)) { return false; } - for (IExtension extension : extensionImplementations) { + for (IExtension extension : realizations) { if (predicate.test(getCallback().apply(extension))) { return true; } diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/FirstOf.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/FirstOf.java index c8ad2558..c7aa6981 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/FirstOf.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/FirstOf.java @@ -43,7 +43,7 @@ public class FirstOf extends Reducer { @Override public Element reduce() { - for (IExtension extension : extensionImplementations) { + for (IExtension extension : realizations) { Element element = getCallback().apply(extension); if (null == predicate || predicate.test(element)) { return element; diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/None.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/None.java index 6b1d2ad5..3280a832 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/None.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/None.java @@ -31,6 +31,6 @@ public class None extends Reducer> { @Override public List reduce() { - return extensionImplementations.stream().map(getCallback()).collect(Collectors.toList()); + return realizations.stream().map(getCallback()).collect(Collectors.toList()); } } diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/Reducer.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/Reducer.java index 548d8cd6..079625d2 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/Reducer.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/reducer/Reducer.java @@ -36,7 +36,7 @@ public abstract class Reducer { protected IExtensionRequest request; @Setter - protected List extensionImplementations; + protected List realizations; @Setter @Getter diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionInvoker.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionInvoker.java index fb886f3b..0c748680 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionInvoker.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionInvoker.java @@ -47,13 +47,13 @@ public class ExtensionInvoker { Assert.isTrue(IExtension.class.isAssignableFrom(targetClz), "can not execute extension point. please implement base extension interface(" + IExtension.class.getName() + ") first."); - List implementations = registry.find(targetClz); - if (CollectionUtil.isEmpty(implementations)) { - implementations = new ArrayList<>(ServiceLoaderRegistry.getSingletonServiceInstances(targetClz)); + List realizations = registry.find(targetClz); + if (CollectionUtil.isEmpty(realizations)) { + realizations = new ArrayList<>(ServiceLoaderRegistry.getSingletonServiceInstances(targetClz)); } - Assert.notEmpty(implementations, "can not find any extension realizations with interface: " + targetClz.getName()); + Assert.notEmpty(realizations, "can not find any extension realizations with interface: " + targetClz.getName()); - reducer.setExtensionImplementations(implementations); + reducer.setRealizations(realizations); reducer.setCallback((ExtensionCallback) callback); return reducer.reduce(); } diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionRegistry.java b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionRegistry.java index 882c9d3b..b835446c 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionRegistry.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/extension/support/ExtensionRegistry.java @@ -56,9 +56,9 @@ public class ExtensionRegistry implements IExtensionRegistry { @SuppressWarnings("unchecked") @Override - public void register(IExtension implementation) { + public void register(IExtension realization) { - Class implClass = implementation.getClass(); + Class implClass = realization.getClass(); if (AopUtils.isAopProxy(implClass)) { implClass = ClassUtils.getUserClass(implClass); } @@ -68,25 +68,25 @@ public class ExtensionRegistry implements IExtensionRegistry { for (Class intf : interfaces) { if (IExtension.class.isAssignableFrom(intf)) { - this.register((Class) intf, implementation); + this.register((Class) intf, realization); } } } private void register(Class extension, IExtension realization) { if (!registry.containsKey(extension) || CollectionUtil.isEmpty(registry.get(extension))) { - List implementations = new ArrayList<>(); - implementations.add(realization); - registry.put(extension, implementations); + List realizations = new ArrayList<>(); + realizations.add(realization); + registry.put(extension, realizations); } else { if (registry.get(extension).contains(realization)) { log.warn(LogMessage.getInstance() .kv("realizationClassName", realization.getClass().getName()) .msg("Extension realization already registered, skip.")); } - List implementations = registry.get(extension); - implementations.add(realization); - registry.put(extension, implementations); + List realizations = registry.get(extension); + realizations.add(realization); + registry.put(extension, realizations); } }