20180507 check
spring框架的核心三个组件:Core、Context、Beans。把Bean比作一场演出中的演员的话,那Context就是这场演出的舞台背景,而Core应该就是演出的道具了。Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对Context来说他就是要发现每个Bean之间的关系,为它们建立这种关系并且要维护好 这种关系。所以Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器,一旦建立起这个Ioc容器后Spring就可以为你工作了。那Core组件又有什么用武之地呢?其实Core就是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。
Bean:
起始spring是面向Bean的编程(BOP,Bean Oriented Programming),Bean才是Spring中的真正的主角。
把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。而这个注入关系在一个叫Ioc容器中管理,那Ioc容器就是被Bean包裹的对象。Spring正是通过把对象包装在 Bean中而达到对这些对象管理以及一些列额外操作的目的。
SpringBean的创建时典型的工厂模式,他的顶级接口是BeanFactory.
BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。最终的默认实现类是DefaultListableBeanFactory,他实现了所有的接口。这些接口主要是为了区分在Spring内部在操作过程中对象的传递和转化过程中,对对象的 数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。 AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为。
Context:
ApplicationContext是Context的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了五个接口,这五个接口主要是扩展了Context的功能。ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean,另外ApplicationContext继承了ResourceLoader接口,使得ApplicationContext可以访 问到任何外部资源。ConfigurableApplicationContext表示该Context是可修改的,也就是在构建Context中用户可以动态添加或修改已有的配置信息。
总体来说ApplicationContext必须要完成以下几件事:
- 标识一个应用环境
- 利用BeanFactory创建Bean对象
- 保存对象关系表
- 能够捕获各种事件
Context作为Spring的Ioc容器,基本上整合了Spring的大部分功能,或者说是大部分功能的基础。
Core:
Core组件作为Spring的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。Resource接口封装了各种可能的资源类型。
Context是把资源的加载、解析和描述工作委托给了ResourcePatternResolver类来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。
Ioc容器:
Ioc容器实际上就是Context组件结合其他两个组件共同构建了一个Bean关系网。
构建整个Ioc容器过程主要包含这样几个步骤:
- 构建BeanFactory,以便于产生所需的“演员”
- 注册可能感兴趣的事件
- 创建Bean实例对象
- 触发被监听的事件
把Ioc容器比作一个箱子,这个箱子里有若干个球的模子,可以用这些模子来造很多种不同的球,还有一个造这些球模的机器,这个机器可以产生球模。那么他们的对应关系就是BeanFactory就是 那个造球模的机器,球模就是Bean,而球模造出来的球就是Bean的实例。那前面所说的几个扩展点又在什么地方呢?BeanFactoryPostProcessor对应到当造球模被造出来时,你将有机会可以对其做出设 当的修正,也就是他可以帮你修改球模。而InitializingBean和DisposableBean是在球模造球的开始和结束阶段,你可以完成一些预备和扫尾工作。BeanPostProcessor就可以让你对球模造出来的球做出 适当的修正。最后还有一个FactoryBean,它可是一个神奇的球模。这个球模不是预先就定型了,而是由你来给他确定它的形状,既然你可以确定这个球模型的形状,当然他造出来的球肯定就是你想要的球了,这样在这个箱子里就可以发现所有你想要的球了。
代理:
代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是Spring实现Aop的关键所在。
原文地址:https://www.cnblogs.com/skyball/p/9000750.html