[英]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.