spring源码解析-IOC容器的基本实现

大纲

  • 容器的基本用法
  • spring启动过程分析(spring生命周期)
  • bean 的生命周期
  • IOC核心类总结
  • 常用扩展点
容器的基本用法
spring 是企业级开发框架, 主要功能有 IOC,AOP,Web,ORM等
spring IOC专门用于管理bean对象, 管理对象的创建,属性注入等
spring AOP 给予动态代理,实现了切面编程,动态实现对象功能扩展
 
spring 与其他框架整合,通过 spring 提供的扩展点,把其他框架的对象交给 spring 管理, 对象交给 spring 管理是想要避免手动创建对象,也可以通过@Autowired 等注解实现属性注入,让我们使用对象起来更加方便
  • spring xml 方式配置示例
//1 xml 方式配置springbean<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置springbean --><bean id="petStore" class="cn.JAVAbus.PetStoreService.class"></bean></beans>//2初始化 IOC容器ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");PetStoreService service = context.getBean("petStore", PetStoreService.class);spring启动过程分析(spring生命周期)
spring源码解析-IOC容器的基本实现

文章插图
spring生命周期与bean生命周期
  • spring启动过程描述
1 BeanDefinition 解析注册
->多种配置方式配置Bean(xml,注解Component,java config)
->各种配置抽象为Resource资源
->通过BeanDefinitionReader 解析BeanDefinition 注册到 BeanDefinitionRegistry
 
2 PostProcessor 各种处理器注册调用
->获取BeanFactory
->注册和调用BeanFactoryPostProcessor(bean工厂后置处理器)
->注册BeanFactoryPostProcessors
 
3 bean 生命周期处理
->实例化对象
->依赖注入
->bean 初始化
-> 存放到SpringContext容器
  • 以AbstractApplicationContext中的refresh()方法为起点进行源码分析
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {this(); //创建BeanDefinitionReader,BeanDefinitionScanner对象//BeanDefinition解析和注册 (DefaultListableBeanFactory.beanDefinitionMap)register(componentClasses);refresh();}public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");//记录容器开始时间startupDate,设置活跃状态为true,设置environment对象this.prepareRefresh();//1 创建beanFactory实例对象, 一般是DefaultListableBeanFactoryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// 空实现留给子类扩展 Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");// Invoke factory processors registered as beans in the context.//2 按照顺序注册BeanFactoryPostProcessors,并且按照顺序调用invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.//3按照顺序注册BeanPostProcessorsregisterBeanPostProcessors(beanFactory);beanPostProcess.end();// 注册国际化相关内容 Initialize message source for this context.initMessageSource();// 初始化事件广播 Initialize event multicaster for this context.initApplicationEventMulticaster();// 空实现留给子类扩展 Initialize other special beans in specific context subclasses.onRefresh();// 注册监听器并且广播早期事件 Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.//4 调用getBean()方法对非延迟加载的bean进行实例化 (最重要,涉及bean生命周期)finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}}}spring bean的生命周期Spring中每个Bean的生命周期如下:
spring源码解析-IOC容器的基本实现


推荐阅读