0

我在运行时将额外的单例 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

但因提到的异常而失败。

4

2 回答 2

0

原因已确定。第二个代理创建者定义建立在 spring-common-manager.xml 中:

“org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”
它拦截名称为 DAO、Dao、*ManagerTarget 的 bean。

在我创建外部 bean 期间,代理 bean classLoader 被设置为系统类加载器。所以代理创建者找不到外部 bean 的类定义。

似乎没有刷新类加载器,对于某些实用程序 bean,例如代理创建者,添加到默认工厂是不可见的。

我的解决方案是获取代理创建者 bean 并为其设置隐式类加载器,但也许存在一些更好的方法来解决这个问题。

于 2010-04-26T07:59:54.673 回答
0

确保 bean:

  • 不是final
  • 有一个非私有的构造函数
于 2010-04-23T14:06:57.293 回答