ApplicationContext和BeanFactory

首先要明白两点:

  1. BeanFactoryApplicationContext都是容器,也就是放置所有Java Bean对象的地方,而且它们的关系是ApplicationContext继承自 BeanFactory
  2. BeanFactory的最重要的一个方法是getBean(),调用这个方法会返回给你一个已经完全初始化好的对应的bean对象,不需要你自己去硬编码对象的创建逻辑和创建过程,这样做的一个好处是一个类就能完全专注于自己的业务逻辑,而不用操心其它的“杂事”。还有一个好处是可以在一个类不知情的情况下把它的依赖类换掉,而不用修改它的代码,这样可以使编程更加简单、不易出错。

至于它们之间的区别其实只有一句话:ApplicationContextBeanFactory的加强版,它提供了许多自动化的功能,这样你就不用在编写程序时自己去实现,比如说AOP。

  1. ApplicationContext在创建时会把配置文件中的或者扫描到的bean已经创建完成,而BeanFactory在创建时只会生成BeanDefinition,然后在你手动调用getBean()函数的时候才会根据BeanDefinition来创建这个bean。其实里面也没有什么黑科技,可以看做是ApplicationContext对于所有的bean都先帮你调用了一下getBean()函数,当然有@Lazy注解或者非单例的除外。
  2. 在1的基础上,ApplicationContext会自动注入几个和环境变量有关的bean,比如environmentApplicationContext还会自动创建并注册BeanPostProcessor,以便在调用getBean()的时候对目标bean进行处理。这是一个重要的功能,AOP就是在BeanPostProcessor的函数里面实现了创建代理的功能。
  3. ApplicationContext提供了发布事件的功能,可以调用ApplicationContext提供的接口来发布事件并监听,同样地,ApplicationContext也会自动创建并注册监听器。

简而言之,ApplicationContext就是为了实现BeanFactory的功能,所以需要处理各种各样的情况,以AnnotationConfigApplicationContext为例,需要先注册配置类,然后从配置类的注解中找有没有@Import了其他的类,然后再进行相应的处理。比如@EnableAspectJAutoProxy注解的定义上有一行代码是@Import(AspectJAutoProxyRegistrar.class),所以就需要找到AspectJAutoProxyRegistrar类,由于它实现了ImportBeanDefinitionRegistrar接口,就调用它的registerBeanDefinitions方法把org.springframework.aop.config.internalAutoProxyCreator类作为一个BeanDefinition也注册到容器中去,接下来根据这个BeanDefinition创建一个AnnotationAwareAspectJAutoProxyCreator类的对象来实现AOP的功能。

你可能感兴趣的:(Spring)