Spring容器的实现
BeanFactory的实现
BeanFactory的实现DefaultListableFactory根据Bean的定义(class, scope,初始化,销毁)来创建bean



创建Config类的BeanDefinition并注册

为什么只有config,而没有bean1、bean2?
因为现在的beanFactory缺失了解析@Configuration、@Bean注解的能力
如何完善功能?
给BeanFactory添加常用的后处理器
![]()

调用这些后处理器
通过类型来获取它们
![]()
拿到后逐一执行,从而实现功能的扩展


Spring中的BeanFactory的原始功能并没有那么完善的,它的扩展功能是由一些后处理器来完成的(补充了一些bean的定义)
把注册到beanFactory中的bean拿出来使用
![]()
![]()
依赖注入的功能没有,依赖注入也是一个扩展功能
![]()
![]()
这种叫做bean的后处理器
它是针对每个bean的生命周期的各个阶段,创建、依赖注入、初始化,提供一些扩展功能(@Autowired\@Resource)
获取他们逐一执行
建立bean过程与后处理器之间的联系


观察一下它的时机

刚开始只保存了一些描述信息在beanFactory中,当第一次用到它的时候才去创建,默认延迟初始化
除非:

预先创建好所有的bean对象

beanFactory只是提供一些基础功能,很多扩展功能都没实现
Autowired是根据成员变量的名字注入bean3。而Resource是根据设置注入bean4,如果两个都加了会注入谁呢?


这更后处理器的优先级有关,因为Autowired后处理器先被注入所以它的优先级高,不过这是可以改变
![]()


ApplicationContext的实现
基于XML配置的实现类
ClassPathXmlApplicationContext:从类路径下加载XML配置文件。
FileSystemXmlApplicationContext:从文件系统路径加载XML配置文件。
基于注解配置的实现类
AnnotationConfigApplicationContext:从Java配置类(使用@Configuration注解的类)加载配置。
@Configurationpublic class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}}
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);基于Web应用的实现类
XmlWebApplicationContext:专门为Web应用设计的ApplicationContext实现类,从Web应用的上下文中加载XML配置文件。
通常在web.xml中配置:
<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>AnnotationConfigServletWebServerApplicationContext:专门为Web应用设计的ApplicationContext实现类,从Java配置类加载配置



