Spring 最重要的观念是 IOC 和 AOP,本篇文章其实就是方式导各人来阐明下 Spring 的 IOC 容器。既然各人平时都要用到 Spring,怎么可以欠好好相识 Spring 呢?阅读本文并不能让你成为 Spring 专家,不外必然有助于各人领略 Spring 的许多观念,辅佐各人排查应用中和 Spring 相关的一些问题。
阅读发起:读者至少需要知道怎么设置 Spring,相识 Spring 中的各类观念,少部门内容我还假设读者利用过 SpringMVC。本文要说的 IOC 总体来说有两处处所最重要,一个是建设 Bean 容器,一个是初始化 Bean,假如读者以为一次性看完本文压力有点大,那么可以按这个思路分两次消化。读者不必然对 Spring 容器的源码感乐趣,也许附录部门先容的常识对读者有些许浸染。
我回收的源码版本是 4.3.11.RELEASE,算是 5.0.x 前较量新的版本了。为了低流浪度,本文所说的所有的内容都是基于 xml 的设置的方法,实际利用已经很少人这么做了,至少不是纯 xml 设置,不外从领略源码的角度来看用这种方法来说无疑是最符合的。假如读者对注解方法的源码感乐趣,也许等我有时间的时候可以写篇文章先容先容。
我但愿能将此文写成一篇 Spring IOC 源码阐明的好文章,但愿通过本文可以让读者不恐惊阅读 Spring 源码。
为了保持文章的严谨性,假如读者发明我那边说错了请必然不惜指出,很是但愿可以听到读者的声音。
引言
先看下最根基的启动 Spring 容器的例子:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml"); }
以上代码就可以操作设置文件来启动一个 Spring 容器了,请利用 maven 的小同伴直接在 dependencies 中加上以下依赖即可,我较量阻挡那些不知道要添加什么依赖,然后把 Spring 的所有相关的对象都加进来的方法。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.11.RELEASE</version> </dependency>
spring-context 会自动将 spring-core、spring-beans、spring-aop、spring-expression 这几个基本 jar 包带进来。
多说一句,许多开拓者入门就直接打仗的 SpringMVC,对 Spring 其实不是很相识,Spring 是渐进式的东西,并不具有很强的侵入性,它的模块也分别得很公道,纵然你的应用不是 web 应用,可能之前完全没有利用到 Spring,而你就想用 Spring 的依赖注入这个成果,其实完全是可以的,它的引入不会对其他的组件发生斗嘴。
空话说完,我们继承。ApplicationContext context = new ClassPathXmlApplicationContext(…) 其实很好领略,从名字上就可以猜出一二,就是在 ClassPath 中寻找 xml 设置文件,按照 xml 文件内容来构建 ApplicationContext。虽然,除了 ClassPathXmlApplicationContext 以外,我们也尚有其他构建 ApplicationContext 的方案可供选择,我们先来看看概略的担任布局是怎么样的:
读者可以大抵看一下类名,源码阐明的时候不至于找不着看哪个类,因为 Spring 为了适应各类利用场景,提供的各个接口都大概有许多的实现类。对付我们来说,就是揪着一个完整的分支看完。虽然,读本文的时候读者也不必太担忧,每个代码块阐明的时候,我城市汇报读者我们在说哪个类第几行。
我们可以看到,ClassPathXmlApplicationContext 兜兜转转了良久才到 ApplicationContext 接口,同样的,我们也可以利用绿颜色的 FileSystemXmlApplicationContext 和 AnnotationConfigApplicationContext 这两个类。
FileSystemXmlApplicationContext 的结构函数需要一个 xml 设置文件在系统中的路径,其他和 ClassPathXmlApplicationContext 根基上一样。
AnnotationConfigApplicationContext 是基于注解来利用的,它不需要设置文件,回收 java 设置类和各类注解来设置,是较量简朴的方法,也是局面所趋吧。
不外本文旨在辅佐各人领略整个构建流程,所以抉择利用 ClassPathXmlApplicationContext 举办阐明。
我们先来一个简朴的例子来看看怎么实例化 ApplicationContext。
首先,界说一个接口:
public interface MessageService { String getMessage(); }
界说接话柄现类:
public class MessageServiceImpl implements MessageService { public String getMessage() { return "hello world"; } }