spring系列源码简要分析

spring

ioc

beanFactory类图
applicationContext类图
参考链接

以通过xml实例化spring的过程来分析:
核心方法入口 ClassPathXmlApplicationContext .refresh

  1. bean容器初始化,初始化完成后会形成一个 beanName-> beanDefinition 的 map
    (方法入口:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    bean容器的初始化动作在ApplicationContext的实现类中)
    * applicationContext持有一个实例化的DefaultListableBeanFactory容器类对象(容器对象实例化)
    * 解析xml配置文件,把配置文件转换成一个个BeanDefinition,保存到map中

  2. bean实例化(由beanFactory负责,spring启动时实例化所有的singleton 非lazy的bean
    方法入口:finishBeanFactoryInitialization(beanFactory);beanFactory.getBean();doGetBean();createBean();doCreateBean())

    • 实例化bean :instanceWrapper = createBeanInstance(beanName, mbd, args);
    • bean属性装配(三层缓存解决bean循环依赖问题):populateBean(beanName, mbd, instanceWrapper);
    • bean初始化完成的回调:exposedObject = initializeBean(beanName, exposedObject, mbd);
      实现了aware接口的回调:invokeAwareMethods(beanName, bean);
      BeanPostProcessor 的 postProcessBeforeInitialization 回调:wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
      InitializingBean 接口或init-method:invokeInitMethods(beanName, wrappedBean, mbd);
      BeanPostProcessor 的 postProcessAfterInitialization 回调:wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

bean循环依赖的三层缓存
singletonFactories : 单例对象工厂的cache
earlySingletonObjects :提前暴光的单例对象的Cache(若有aop则返回的是代理类)
singletonObjects:单例对象的cache

循环依赖的bean被aop

aop

BeanPostProcessor后置处理器,
AbstractAutoProxyCreator 实现的 postProcessAfterInitialization() 方法,实现对bean的增强(动态代理)

aop源码参考资料

spring mvc

方式一:web容器启动,实例化spring容器和spring mvc容器
web容器启动加载spring mvc
web容器初始化

web容器启动时,

  1. 初始化Listener,执行contextinitialized
    web.xml listener中配置spring 容器的初始化执行类,作为listener被web容器加载初始化,并放入servletContext。(父容器)
  2. 初始化filter,执行init方法
  3. 初始化serlet,执行init方法
    可以配置容器初始化时,就实例化配置的servlet,web.xml中配置spring mvc的dispatcherSerlet,加载spring mvc容器。(子容器,并设置父容器为spring容器)

spring mvc源码分析
前端控制器DispatchServlet
处理器映射器HandleMapping
处理器适配器HandleAdpter
视图解析器ModelAndView

方式二:spring boot内置web容器时,实例化spring容器,通过子类扩展启动web容器
spring boot内存web容器启动
5. 根据classpath下存在的类判断时应该加载那种applicationContext (spring mvc/webflux mvc/default)
6. 调用spring初始化的refresh方法,先初始化beanFactory容器(beanDefinition);在子类实现onfresh方法,onfresh方法中创建并启动web容器,根据spring facoties spi机制获取指定的web容器bean(tomcat/jetty/undertow等),初始化web容器(包含注入servlet3.0标准的内容listener/fliter/servelt,如spring mvc的dispatcherServlet),启动web容器
7. 继续实例化其他的spring bean

spring 事务管理

spring事务管理
// todo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值