如果我通过ApplicationContext getBean方法

时间:2015-07-28 20:21:18

标签: java spring

我知道我不能在非托管的spring类中使用@Autowired注释。但是我注意到,如果我通过ApplicationContext getBean方法检索它,我能够在非托管的spring类中获取bean实例。 谁能解释我为什么会这样?选项之间有什么不同?在两个春天都不知道非托管类

2 个答案:

答案 0 :(得分:3)

1)如果你使用@Autowired,你可以在非托管的spring类中使用@Configurable - 使用内部方面weaving spring将设法将引用的bean自动装入你的“Configurable”类当它用“new”运算符构造时。以下是一篇文章如何运作:http://www.javacodegeeks.com/2013/09/spring-configurable-magic.html 如果一个类不可配置spring,则无法注意何时创建新实例以自动装配其引用。

2)ApplicationContext是“中央界面,为应用程序提供配置。”在这里,您可以访问整个Spring托管bean等。这就是为什么您可以通过ApplicationContext访问它来获取所有内容。 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html

答案 1 :(得分:0)

好的,所以这里有重点:

  1. “bean声明”(在xml或java中)只是如何实例化对象(而不是对象本身)的一个方法。
  2. 当spring应用程序启动时,beanFactory从beanDefinitionReader接收这些配方,根据它们实例化对象(配方),然后将它们(对象)传递给beanPostProcessors列表(多次),它们将“依赖”注入实例化对象然后将对象放入hashMap。
  3. 粗略地说applicationContext是一个暴露对这个bean的访问的类;
  4. 这就是你如何使用applicationContext从spring应用程序中访问这个bean。

    另一件事是,实际上你可以通过@Configurable将bean注入非托管bean。在这种情况下,AspectJ将用于完成这项工作