任何人都可以解释我们致电
时会发生什么ApplicationContext.getApplicationContext().getBean(abcclassName.class)
将abcclassName作为抽象类。
我知道抽象类无法实例化。那怎么办?
答案 0 :(得分:0)
我从来没有使用抽象类,但使用接口。
它将做的是获取在您的上下文中定义的子类的实例。换句话说,如果您在上下文中定义了类(Animal的子类)的bean,并使用Animal类传递给ApplicationContext.getBean()。你会让猫回来。
如果您的上下文中有多个子类,它将抛出异常。
答案 1 :(得分:0)
查看DefaultListableBeanFactory - source的源代码 - 应该回答您的问题。 (这两个链接都是针对3.0.x版本的,因为这是我在GrepCode中找到的。我想在通过类型查找匹配bean方面没有太大变化)
基本上,它接受类,并在ApplicationContext中查找可分配给提供的类型的Bean。
方法AbstractBeanFactory#isTypeMatch(String, Class<?>)
包含您最感兴趣的代码,并且有一条路径通过DefulatListableBeanFactory#getBean(Class<?>)
方法到达它。
答案 2 :(得分:0)
在浏览源代码Spring 3.0.5之后,当您对抽象类执行ApplicationContext.getApplicationContext().getBean(abcclassName.class)
并且抽象类未配置为@component时,AbstractBeanFactory调用isTypematch方法来获取正确的实体 。
基本上它需要所有bean(它们在上下文中启动)并逐个迭代,并将检查bean是否为工厂请求的bean,或者bean可以为所请求的bean分配。
如果只有一个bean使用该类型解析,则返回该bean
如果找到多个bean,则返回错误。
return !BeanFactoryUtils.isFactoryDereference(name) &&
typeToMatch.isAssignableFrom(beanInstance.getClass());
typeToMatch.isAssignableFrom(beanInstance.getClass());
调用使用Object类public native boolean isAssignableFrom(Class<?> cls);
中的Native方法来检查