簡體   English   中英

Spring bean定義在運行時加載到XmlWebApplicationContext后,CGLIB代理錯誤

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

我在運行時將其他的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");

畢竟,xmlWebApplicationContext包含bean的所有外部定義。 但是,當我嘗試從上下文異常中獲取bean時,會拋出:

Couldn't generate CGLIB proxy for class ...

我在調試模式下看到,在Bean初始化過程中,第一次代理是由org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator生成的

然后嘗試使用org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator生成代理

但由於提到的異常而失敗。

確保bean:

  • 不是final
  • 有一個非私有的構造函數

原因已確定。 第二個代理創建者定義是在spring-common-manager.xml中建立的:

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

在創建外部bean的過程中,代理bean classLoader被設置為系統類加載器。 因此,代理創建者找不到外部bean的類定義。

似乎沒有刷新類加載器(添加到默認工廠)對於某些實用程序Bean(例如代理創建者)是不可見的。

我的解決方案是獲取代理創建者bean並為其隱式設置類加載器,但是也許存在解決此問題的更好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM