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

原因が特定されました。2番目のプロキシクリエーター定義はspring-common-manager.xmlで作成されました。

"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
これは、DAO、Dao、*ManagerTargetという名前のBeanをインターセプトします。

外部Beanの作成中に、プロキシBeanclassLoaderがシステムクラスローダーに設定されました。そのため、プロキシ作成者は外部Beanのクラス定義を見つけることができませんでした。

デフォルトのファクトリに追加されたリフレッシュクラスローダーがないと、プロキシクリエーターなどの一部のユーティリティBeanでは表示されないようです。

私の解決策は、プロキシクリエーターBeanを取得し、それに暗黙的にクラスローダーを設定することですが、この問題を解決するためのより良い方法が存在する可能性があります。

于 2010-04-26T07:59:54.673 に答える
0

Bean を確認します。

  • ではないfinal
  • プライベートでないコンストラクターを持つ
于 2010-04-23T14:06:57.293 に答える