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 76e8f7f9917a145fb89fb57aab44c20a46d11ebc..8eb8d7c0d72ba0e624dd4fcdd0559bf44f146ddd 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;