From 0238cb23d91e07e0c5a568cb3d64e5ac3584f5b5 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Mon, 6 Jun 2022 21:05:20 +0800 Subject: [PATCH] =?UTF-8?q?=3DObjectProvider=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/PluginListableBeanFactory.java | 143 ++++++++++++------ .../spring/MainApplicationContextProxy.java | 3 - 2 files changed, 97 insertions(+), 49 deletions(-) diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java index f3920cc..76e8f7f 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/PluginListableBeanFactory.java @@ -18,14 +18,10 @@ package com.gitee.starblues.bootstrap; import com.gitee.starblues.bootstrap.annotation.AutowiredType; import com.gitee.starblues.bootstrap.processor.ProcessorContext; -import com.gitee.starblues.bootstrap.realize.AutowiredTypeDefiner; import com.gitee.starblues.bootstrap.utils.DestroyUtils; -import com.gitee.starblues.core.classloader.MainResourceMatcher; -import com.gitee.starblues.core.classloader.PluginClassLoader; import com.gitee.starblues.spring.MainApplicationContext; import com.gitee.starblues.spring.SpringBeanFactory; import com.gitee.starblues.utils.ReflectionUtils; -import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -35,7 +31,6 @@ import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.beans.factory.support.ScopeNotActiveException; import org.springframework.lang.Nullable; import java.util.*; @@ -68,6 +63,14 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { @Nullable Set autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException { AutowiredType.Type autowiredType = getAutowiredType(descriptor); + Class dependencyType = descriptor.getDependencyType(); + if (dependencyType == ObjectFactory.class || dependencyType == ObjectProvider.class) { + Object dependencyObj = super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, + typeConverter); + ObjectProvider provider = (ObjectProvider) dependencyObj; + return new PluginObjectProviderWrapper(provider, requestingBeanName, descriptor, autowiredType); + } + if(autowiredType == AutowiredType.Type.MAIN){ Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); if(dependencyObj != null){ @@ -78,14 +81,8 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { return super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ try { - Object dependencyObj = super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, + return super.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); - - if(dependencyObj instanceof ObjectProvider){ - ObjectProvider provider = (ObjectProvider) dependencyObj; - return new PluginObjectProviderWrapper(provider, requestingBeanName, descriptor, autowiredType); - } - return dependencyObj; } catch (BeansException e){ if(e instanceof NoSuchBeanDefinitionException){ Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); @@ -154,7 +151,6 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { } - @AllArgsConstructor private class PluginObjectProviderWrapper implements ObjectProvider { private final ObjectProvider pluginObjectProvider; @@ -163,36 +159,55 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { private final DependencyDescriptor descriptor; private final AutowiredType.Type autowiredType; + private PluginObjectProviderWrapper(ObjectProvider pluginObjectProvider, + String requestingBeanName, + DependencyDescriptor descriptor, + AutowiredType.Type autowiredType) { + this.pluginObjectProvider = pluginObjectProvider; + this.requestingBeanName = requestingBeanName; + this.descriptor = new NestedDependencyDescriptor(descriptor); + this.autowiredType = autowiredType; + } + @Override public Object getObject() throws BeansException { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + if(autowiredType == AutowiredType.Type.PLUGIN) { + return pluginObjectProvider.getObject(); + } else if(autowiredType == AutowiredType.Type.MAIN){ Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); if(dependencyObj != null){ return dependencyObj; } - return pluginObjectProvider.getObject(); - } else { + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN) { try { return pluginObjectProvider.getObject(); - } catch (Exception e){ + } catch (Exception e) { Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); - if(dependencyObj != null){ + if (dependencyObj != null) { return dependencyObj; } throw e; } + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; + } + return pluginObjectProvider.getObject(); } + throw new NoSuchBeanDefinitionException(this.descriptor.getResolvableType()); } @Override public Object getObject(final Object... args) throws BeansException { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + if(autowiredType == AutowiredType.Type.PLUGIN){ + return pluginObjectProvider.getObject(args); + } else if(autowiredType == AutowiredType.Type.MAIN){ Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); if(dependencyObj != null){ return dependencyObj; } - return pluginObjectProvider.getObject(args); - } else { + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ try { return pluginObjectProvider.getObject(); } catch (Exception e){ @@ -203,25 +218,37 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { } throw e; } + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; + } + return pluginObjectProvider.getObject(args); } + throw new NoSuchBeanDefinitionException(this.descriptor.getResolvableType()); } @Override @Nullable public Object getIfAvailable() throws BeansException { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ - Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); - if(dependencyObj != null){ - return dependencyObj; - } + if(autowiredType == AutowiredType.Type.PLUGIN){ return pluginObjectProvider.getIfAvailable(); - } else { + } else if(autowiredType == AutowiredType.Type.MAIN){ + return resolveDependencyFromMain(requestingBeanName, descriptor); + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ Object dependencyObj = pluginObjectProvider.getIfAvailable(); if(dependencyObj == null){ dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); } return dependencyObj; + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; + } + return pluginObjectProvider.getIfAvailable(); } + return null; } @Override @@ -235,19 +262,24 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { @Override @Nullable public Object getIfUnique() throws BeansException { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ - Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); - if(dependencyObj != null){ - return dependencyObj; - } + if(autowiredType == AutowiredType.Type.PLUGIN){ return pluginObjectProvider.getIfUnique(); - } else { + } else if(autowiredType == AutowiredType.Type.MAIN){ + return resolveDependencyFromMain(requestingBeanName, descriptor); + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ Object dependencyObj = pluginObjectProvider.getIfUnique(); if(dependencyObj == null){ dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); } return dependencyObj; + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Object dependencyObj = resolveDependencyFromMain(requestingBeanName, descriptor); + if(dependencyObj != null){ + return dependencyObj; + } + return pluginObjectProvider.getIfUnique(); } + return null; } @Override @@ -260,38 +292,48 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { @Override public Stream stream() { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ - Set collection = getStreamOfMain(); - if(!collection.isEmpty()){ - return collection.stream(); - } + if(autowiredType == AutowiredType.Type.PLUGIN){ return pluginObjectProvider.stream(); - } else { + } else if(autowiredType == AutowiredType.Type.MAIN){ + return getStreamOfMain().stream(); + } else if (autowiredType == AutowiredType.Type.PLUGIN_MAIN){ Stream stream = pluginObjectProvider.stream(); List collect = stream.collect(Collectors.toList()); if(!collect.isEmpty()){ return collect.stream(); } return getStreamOfMain().stream(); + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Set collection = getStreamOfMain(); + if(!collection.isEmpty()){ + return collection.stream(); + } + return pluginObjectProvider.stream(); } + return Stream.empty(); } @Override public Stream orderedStream() { - if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ - Set collection = getStreamOfMain(); - if(!collection.isEmpty()){ - return collection.stream().sorted(); - } - return pluginObjectProvider.stream(); - } else { + if(autowiredType == AutowiredType.Type.PLUGIN){ + return pluginObjectProvider.orderedStream(); + } else if(autowiredType == AutowiredType.Type.MAIN){ + return getStreamOfMain().stream().sorted(); + } else if(autowiredType == AutowiredType.Type.PLUGIN_MAIN){ Stream stream = pluginObjectProvider.stream(); List collect = stream.collect(Collectors.toList()); if(!collect.isEmpty()){ return collect.stream(); } return getStreamOfMain().stream().sorted(); + } else if(autowiredType == AutowiredType.Type.MAIN_PLUGIN){ + Set collection = getStreamOfMain(); + if(!collection.isEmpty()){ + return collection.stream().sorted(); + } + return pluginObjectProvider.stream(); } + return Stream.empty(); } @SuppressWarnings("unchecked") @@ -302,4 +344,13 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { } } + + private static class NestedDependencyDescriptor extends DependencyDescriptor { + + public NestedDependencyDescriptor(DependencyDescriptor original) { + super(original); + increaseNestingLevel(); + } + } + } diff --git a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java index ea3bde4..4c5b61b 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java +++ b/spring-brick/src/main/java/com/gitee/starblues/spring/MainApplicationContextProxy.java @@ -83,9 +83,6 @@ public class MainApplicationContextProxy extends ApplicationContextProxy impleme @Override public Object resolveDependency(String requestingBeanName, Class dependencyType) { - if(!ObjectUtils.isEmpty(requestingBeanName) && applicationContext.containsBean(requestingBeanName)){ - return applicationContext.getBean(requestingBeanName); - } try { return applicationContext.getBean(dependencyType); } catch (Exception e){ -- Gitee