写在前面
正本文参考了《spring技术内幕》和spring 4.0.5源码。本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解。Spring IOC
一、容器初始化
容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。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定位。

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

被折叠的 条评论
为什么被折叠?



