実行時に追加のシングルトン 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
しかし、言及された例外で失敗します。