简体   繁体   English

Spring bean定义在运行时加载到XmlWebApplicationContext后,CGLIB代理错误

[英]CGLIB proxy error after spring bean definition loading into XmlWebApplicationContext at runtime

I load additional singleton beans definitions at runtime from external jar file into existing XmlWebApplicationContext of my application: 我在运行时将其他的singleton bean定义从外部jar文件加载到应用程序的现有XmlWebApplicationContext中:


BeanFactory beanFactory = xmlWebApplicationContext.getBeanFactory();
DefaultListableBeanFactory defaultFactory = (DefaultListableBeanFactory)beanFactory;
final URL url = new URL("external.jar");
final URL[] urls = {url};
ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
defaultFactory.setBeanClassLoader(loader);
final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(defaultFactory);
final DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
resourceLoader.setClassLoader(loader);
scanner.setResourceLoader(resourceLoader);
scanner.scan("com.*");
Object bean = xmlWebApplicationContext.getBean("externalBean");

After all above xmlWebApplicationContext contains all external definitions of beans. 毕竟,xmlWebApplicationContext包含bean的所有外部定义。 But when i am trying to get bean from context exception is thrown: 但是,当我尝试从上下文异常中获取bean时,会抛出:

Couldn't generate CGLIB proxy for class ...

I saw in debug mode that in the bean initialization process first time proxy is generated by org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator 我在调试模式下看到,在Bean初始化过程中,第一次代理是由org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator生成的

and than it is tried to generate proxy with org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator 然后尝试使用org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator生成代理

but fails with mentioned exception. 但由于提到的异常而失败。

Make sure the bean: 确保bean:

  • isn't final 不是final
  • has a non-private constructor 有一个非私有的构造函数

Cause was determined. 原因已确定。 Second proxy creator definition was founded in spring-common-manager.xml: 第二个代理创建者定义是在spring-common-manager.xml中建立的:

"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
which intercepts beans with names DAO, Dao, *ManagerTarget.

During my external bean creation, proxy bean classLoader was set to system class loader. 在创建外部bean的过程中,代理bean classLoader被设置为系统类加载器。 So proxy creator couldn't find class definition for external bean. 因此,代理创建者找不到外部bean的类定义。

It seems that without refresh class loader, which added to default factory is invisible for some utility beans such proxy creators. 似乎没有刷新类加载器(添加到默认工厂)对于某些实用程序Bean(例如代理创建者)是不可见的。

My Solution is to obtain proxy creator bean and to set implicitly class loader to it, but maybe some better way exists to resolve this problem. 我的解决方案是获取代理创建者bean并为其隐式设置类加载器,但是也许存在解决此问题的更好方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM