Spring IOC和Spring AOP的实现原理(源码主线流程)

本文深入探讨了Spring框架的两大核心特性——IOC(控制反转)和AOP(面向切面编程)的实现原理。首先,详细阐述了Spring IOC容器的初始化过程,包括Resource定位、BeanDefinition的解析与注册。接着,讲解了IOC容器如何进行依赖注入,特别是对lazy-init属性的处理。然后,转向Spring AOP部分,介绍了Advisor链的初始化、代理类的生成以及在调用时如何进行拦截。
摘要由CSDN通过智能技术生成

写在前面

      正本文参考了《spring技术内幕》和spring 4.0.5源码。本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解。

Spring IOC

一、容器初始化

      容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。
ioc容器初始化流程图

1、Resource定位:

      在refresh方法中调用obtainFreshBeanFactory方法告诉子类刷新beanfactory(其中是调用refreshBeanFactory刷新后getBeanFactory获取刷新后的factory返回)。在刷新过程refreshBeanFactory中如果factory已经有了要消除再新建factory,其中loadBeanDefinitions是加载bean定义的方法。

      在loadBeanDefinitions方法中创建了 BeanDefinitionReader的实现类 调用其loadBeanDefinitions方法(这个方法是重载方法,参数有为Resource的也有为String路径的,getConfigResources方法(默认返回null,子类重写,如ClassPathXmlApplicationContext类)和getConfigLocations方法获得Resource集合和资源路径集合(一般一个为空,一般是将容器的参数path设定为configLocations,ClassPathXmlApplicationContext有一种构造器是不设定configLocations而是直接用参数path生成ClassPathResource集合设定为configResources)分别进行load,实际上以路径为参数的重载方法在定位完Resource也会调用以resource为参数的loadBeanDefinitions来解析载入BeanDefinition,这个是第二步在下面介绍)。

      在BeanDefinitionReader的loadBeanDefinitions(path参数)方法中根据 ResourceLoader 类型以两种方式加载(如果是 ant正则表达式方式的(如PathMatchingResourcePatternResolver)一个路径定位多个resource 或者 默认方式(applicationContext继承的是DefaultResourceLoader实现方式)定位一个resource ),分别调用ResourceLoader的 getResource (以/开头的构建ClassPathContextResource,以classpath开头的去掉classpath构建ClassPathResource,如果都不是的尝试构建UrlResource,如果构建失败就调用getResourceByPath这个具体applicationContext实现类里重写的方法构建特定Resource,如FileSystemXmlApplicationContext就是FileSystemResource)或 getResources (PathMatchingResourcePatternResolver的正则方式这里不详细描述)完成Resource定位。

2、从Resource中解析和载入BeanDefinition:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值