From bd64d80cd48018135387489465492cb35e3e9be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E4=BC=9F=E5=8D=8E?= Date: Mon, 20 Jun 2022 09:59:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8F=92=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E4=B8=BB=E7=A8=8B=E5=BA=8F=E5=AD=98=E5=9C=A8?= =?UTF-8?q?ClassLoader=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/PluginListableBeanFactory.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) 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 76e8f7f..8eb8d7c 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 @@ -33,6 +33,9 @@ import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.lang.Nullable; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -131,12 +134,46 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { try { dependencyObj = applicationContext.resolveDependency(requestingBeanName, descriptor.getDependencyType()); + if(dependencyObj != null) { + Class[] interfaces = dependencyObj.getClass().getSuperclass().getInterfaces(); + if(interfaces == null || interfaces.length==0){ + interfaces = dependencyObj.getClass().getInterfaces(); + } + if(interfaces == null || interfaces.length==0){ + return dependencyObj; + } + ClassLoader curClassLoader = Thread.currentThread().getContextClassLoader(); + MainProxyInvocationHandler proxyInvocationHandler = new MainProxyInvocationHandler(dependencyObj,curClassLoader); + dependencyObj = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), interfaces, proxyInvocationHandler); + } } catch (Exception e){ return null; } return dependencyObj; } + /** + * 主类方法增加classloader重置拦截 + */ + private class MainProxyInvocationHandler implements InvocationHandler { + private final ClassLoader curClassLoader; + private final Object target; + private MainProxyInvocationHandler(Object target,ClassLoader curClassLoader){ + this.target = target; + this.curClassLoader = curClassLoader; + } + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Thread thread = Thread.currentThread(); + try{ + thread.setContextClassLoader(target.getClass().getClassLoader()); + return method.invoke(target, args); + } + finally { + thread.setContextClassLoader(this.curClassLoader); + } + } + } private void destroyAll(){ ReflectionUtils.findField(this.getClass(), field -> { field.setAccessible(true); @@ -150,7 +187,6 @@ public class PluginListableBeanFactory extends DefaultListableBeanFactory { }); } - private class PluginObjectProviderWrapper implements ObjectProvider { private final ObjectProvider pluginObjectProvider; -- Gitee