实现“Context.getApplicationContext()。getBean”

时间:2014-01-15 17:13:46

标签: spring applicationcontext

任何人都可以解释我们致电

时会发生什么
ApplicationContext.getApplicationContext().getBean(abcclassName.class)

将abcclassName作为抽象类。

我知道抽象类无法实例化。那怎么办?

3 个答案:

答案 0 :(得分:0)

我从来没有使用抽象类,但使用接口。

它将做的是获取在您的上下文中定义的子类的实例。换句话说,如果您在上下文中定义了类(Animal的子类)的bean,并使用Animal类传递给ApplicationContext.getBean()。你会让猫回来。

如果您的上下文中有多个子类,它将抛出异常。

请参阅此参考:http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/beans/factory/BeanFactory.html#getBean%28java.lang.Class%29

答案 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方法来检查