本章开始来学习下Spring的源码,看看Spring框架最核心、最常用的功能是怎么实现的。
网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来。这并不能说有问题,但没有从一个很好的、容易切入的角度去了解学习。博主来尝试抛弃一些所知,从使用上入手,步步回溯源码去了解学习。
很多人会混乱IOC和DI的两个概念,其实这两者是层面的不同。
具体的区别的区别:IOC是DI的原理。依赖注入是向某个类或方法注入一个值,其中所用到的原理就是控制反转。
所以说到操作层面的时候用DI,原理层的是说IOC,下文亦同。
对于DI最新使用方法,现在都是建议用Java注解去标识。但是相信笔者,不要用这种方式去看源码。笔者本来是想从Java注解入手去一步步看源码,debug看看发生什么了。但发现更多时间是在调SpringBoot和AOP的源码。在看了一天后,还是换一种思路吧,因为AOP是打算在下一章再讲的。
所以我用XML的方式,搭了一个最简单的Spring项目来学习其中IOC的源码。建议大家把代码拉下来,跟着笔者思路来一起看。
源码在此:https://github.com/Zack-Ku/spring-ioc-demo
搭建内容
maven的依赖,只添加了spring-context模板,用的是4.3.11版本(部分代码)
     <dependencies>         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-context</artifactId>             <version>4.3.11.RELEASE</version>         </dependency>     </dependencies>作为Bean的Service(部分代码)
    public class TestBeanServiceImpl implements TestBeanService {         public String getBean() {             return "a test bean";         }     }配置XML(部分代码)
    <bean id="testBeanService" class="com.zack.demo.TestBeanServiceImpl"/>启动类。只是加载了下spring的xml配置,然后从context中拿出Bean,这就是完整IOC的过程了。(部分代码)
    public class Application {         public static void main(String[] args) {             // 加载xml配置             ApplicationContext context =                 new ClassPathXmlApplicationContext("classpath:application.xml");              // IOC获取Bean             TestBeanService testBeanService = context.getBean(TestBeanService.class);              System.out.println(testBeanService.getBean());         }     }    最后启动就能获取这个bean,看到getMessage()打印的内容了。
这样就是一个比较纯粹的Spring-IOC的项目了。我们直接从启动类开始看起
Bean的含义
前置先解释下这个Bean的含义,因为会贯穿整个流程。
通俗地讲,Bean就是IOC的容器。如上面的例子,将TestBeanService注册到Spring里,那么TestBeanService就是Spring的里面的一个Bean。Demo里面context.getBean()就是从Spring中取出这个Bean,完成控制反转的。
所以我们的重点就是要看看Spring到底是怎么生成管理这些Bean的。
ClassPathXmlApplicationContext
启动类中,加载配置的ClassPathXmlApplicationContext肯定就是完成IOC的核心。不知道它到底是怎么做的,怎么入手呢?
先来看看它的类图
先分析下这个类图,
ClassPathXmlApplicationContext类是AbstractApplicationContext抽象类的子类AbstractApplicationContext类是ApplicaionContext接口的实现。ApplicaionContext接口集合了非常多的内容,其中和IOC比较相关的就是ListableBeanFactory接口和HierarchicalBeanFactory接口ListableBeanFactory接口和
