为什么以及在哪种情况下使用不同的classLoaders弹出加载bean两次?

时间:2017-01-18 08:37:41

标签: java spring classloader classcastexception

最近我参观了一次采访。

我被问到:

MyClass myClass =(MyClass) applicationContext.getBean("myClass");

抛出ClassCastException

applicationContext.getBean("myClass").getClass()会返回MyClass

我对这个问题感到惊讶。我只能回复不同类加载器加载的类。

  1. 如何实现这一目标?
  2. 为什么Spring使用不同的类加载器?

1 个答案:

答案 0 :(得分:1)

是的,不同的类加载器将导致这种情况。这不是常见的情况,但是某些应用程序使用多个类加载器(最常见的示例是容器和应用程序服务器)。你可以重现它

您可以通过指定URLClassLoader

来初始化spring应用程序上下文

让您的课程位于

/home/jigar.joshi/foo/package/MyClass

并配置应用程序上下文以使用URLClassLoader,如此

URL[] classURLs = { new URL("file:///home/jigar.joshi/foo") };
URLClassLoader urlClassLoader = new URLClassLoader(classURLs);
ApplicationContext context = new     ClassPathXmlApplicationContext("spring/applicationContext.xml") {
            protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
                super.initBeanDefinitionReader(reader);
                reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
                reader.setBeanClassLoader(urlClassLoader);
                setClassLoader(urlClassLoader);
            }
        };

        MyClass m = context.getBean("MyClass");