多图详解Spring框架的设计理念与设计模式
- 格式:doc
- 大小:732.00 KB
- 文档页数:38
Spring简介什么是Spring?spring是分层的avaSE以及javaEE应⽤于全栈的轻量级开源框架,以IOC(Inverse Of Control)控制反转,AOP(Aspect Oriented Programing)⾯向切⾯编程为核⼼,提供表现层SpringMVC以及持久层Spring,并且可整合多种其他开源框架。
spring的本质是管理对象,包括创建对象及维护对象之间的关系。
spring的优点1)⽅便解耦,简化开发通过spring的IOC可将对象的创建,以及对象之间的依赖都交由spring容器来进⾏管理,这样可以降低程序之间的耦合。
并且开发时也只需关注上层的应⽤,不⽤再多关注底层的应⽤。
2)AOP编程的⽀持spring⽀持AOP⾯向切⾯编程,许多OOP⾯向对象编程不能或很难实现的功能,都可通过AOP轻松实现。
3)声明式事务的⽀持可以将我们从单调烦闷的事务管理中解放出来,通过声明式事务的⽅式,可以灵活的进⾏事务管理,进⽽提⾼开发的质量和效率。
4)⽅便程序的测试可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。
5)⽅便集成各种优秀的框架Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接⽀持。
6)降低javaEE的API的使⽤难度Spring对 JavaEE API(如 JDBC、JavaMail、远程调⽤等)进⾏了薄薄的封装层,使这些API 的使⽤难度⼤为降低。
7)spring框架的源码是经典学习的案例Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对 Java技术的⾼深造诣。
它的源代码⽆疑是Java技术的最佳实践的范例。
通过Spring进⾏解耦什么叫程序的耦合?在程序中,对象之间相互依赖,相互传递数据,这种相互关联的程度越⾼,程序的耦合度就越⾼。
狂神说Java-Spring详解1、Spring1.1、简介Spring:春天----->给软件⾏业带来了春天!2002,⾸次推出了Spring框架的雏形: interface21框架!Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3⽉24⽇,发布了1.0正式版。
Rod Johnson ,Spring Framework创始⼈,著名作者。
很难想象Rod Johnson的学历,真的让好多⼈⼤吃⼀惊,他是悉尼⼤学的博⼠,然⽽他的专业不是计算机,⽽是⾳乐学。
spring理念:使现有的技术更加容易使⽤,本⾝是⼀个⼤杂烩,整合了现有的技术框架!SSH : Struct2 + Spring + Hibernate !SSM : SpringMvc + Spring + Mybatis!官⽹: https:/lspring.io/projects/spring-framework#overviewGitHub: https:/lspring-projects/spring-framework1 <!-- https : ///artifact/org.springframework/spring-webmvc -->2<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</ artifactId><version>5.2.O.RELEASE</version></ dependency><!-- https:///artifact/org.springframework/spring-webmvc -->8<dependency><groupId>org.springframework</groupId><artifactid>spring-jdbc</artifactId><cversion>5.2.0.RELEASE</version></ dependency>1.2、优点Spring是⼀个开源的免费的框架(容器)!Spring是⼀个轻量级的、⾮⼊侵式的框架!控制反转(IOC),⾯向切⾯编程(AOP) !⽀持事务的处理,对框架整合的⽀持!总结⼀句话: Spring就是⼀个轻量级的控制反转(IOC))和⾯向切⾯编程(AOP)的框架!2、IOC理论推导1. UserDao 接⼝2. UserDaoImpl 接⼝实现类3. UserService 业务接⼝4. UserServiceImpl 业务实现类在之前的业务中,⽤户的需求可能会影响我们原来的代码,我们需要根据⽤户的需求去修改源代码,如果程序代码量⼗分⼤,修改⼀次的成本代价⼗分昂贵!我们使⽤⼀个Set接⼝实现,已经发⽣了⾰命性的变化!//利⽤set动态实现值的注⼊public void setUserDao(UserDao userDao) {erDao = userDao;}之前,程序是主动创建对象,控制权在程序员⼿上!使⽤了Set注⼊后,程序不再具有主动性,⼆⼗变成了被动的接受对象这种思想,从本质上解决了问题,我们程序员不⽤再去管理对象的创建!系统的耦合性⼤⼤降低,可以更加专注在业务的实现上!这是IOC 的原型!IOC本质控制反转loC(Inversion of Control),是⼀种设计思想,DI(依赖注⼊)是实现loC的⼀种⽅法,也有⼈认为DI只是loC的另⼀种说法。
Spring核⼼技术详解⼀、Sring简介Spring是⼀个分层的Java SE/EE应⽤⼀站式的轻量级开源框架。
Spring核⼼是IOC和AOP。
Spring主要优点包括:⽅便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进⾏控制,避免硬编码造成的程序耦合度⾼。
AOP编程的⽀持,通过Spring提供的AOP功能,⽅便进⾏⾯向切⾯编程。
声明式事务的⽀持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活地进⾏事务的管理,提⾼开发效率和质量。
⽅便程序的测试,可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作。
⽅便集成各种优秀框架,Spring提供了对各种优秀框架的直接⽀持。
⼆、Spring体系结构如下图所⽰,整个spring框架按其所属功能可以划分为五个主要模块,这五个模块⼏乎为企业应⽤提供了所需的⼀切,从持久层、业务层到表现层都拥有相应的⽀持,这就是为什么称Spring是⼀站式框架的原因。
核⼼模块(Core Container) Spring的核⼼模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,⽤配置的⽅式进⾏依赖关系描述。
由IoC容器负责类的创建,管理,获取等。
BeanFactory接⼝是Spring框架的核⼼接⼝,实现了容器很多核⼼的功能。
Context模块构建于核⼼模块之上,扩展了BeanFactory的功能,包括国际化,资源加载,邮件服务,任务调度等多项功能。
ApplicationContext是Context模块的核⼼接⼝。
表达式语⾔(Expression Language)是统⼀表达式语⾔(EL)的⼀个扩展,⽀持设置和获取对象属性,调⽤对象⽅法,操作数组、集合等。
使⽤它可以很⽅便的通过表达式和Spring IoC容器进⾏交互。
AOP模块Spring AOP模块提供了满⾜AOP Alliance规范的实现,还整合了AspectJ这种AOP语⾔级的框架。
什么是spring框架
⼀bai.概念:1. spring是开源的轻量级框架
2 spring核⼼主要两部分:
(1)aop:⾯向切⾯编程,扩展功能不是修改源代码实现
(2)ioc:控制反转,
- ⽐如有⼀个类,在类⾥⾯有⽅法(不是静态的⽅法),调⽤类⾥⾯的⽅法,创建类的对象,使⽤对象调⽤⽅法,创建类对象的过程,需要new出来对象
- 把对象的创建不是通过new⽅式实现,⽽是交给spring配置创建类对象
⼆.好处
我⽤通俗的话给你解释把。
⾸先你不⽤框架不是每次创建对象都要⽤关键字“new”呢?对吧。
有了spring配置就不⽤new了,直接拿。
举个例⼦:假如你吃饭,每次你要吃饭时都要⾃⼰准备碗和筷⼦,每次都要⾃⼰准备,⽤了框架后,再吃饭你只要吃就⾏了,就不⽤准备碗和筷⼦了因为spring已经给你准备好了。
这样是不是很⽅便。
pring主要就是不⽤你⾃⼰创建对象,都配置在配置⽂件中。
如果你写好⼀个项⽬,你再a类中创建了b类的⽅法,c类也创建了b类的⽅法,如果那天要改b类的类名,你就要在a和c中都改,如果有100个类都⽤了b类呢?那你不是要改死哦
如果⽤了spring,你只要修改配置⽂件⼀个位置就好了,是不是很⽅便维护呢。
Spring中使⽤了哪些设计模式?好了,话不多说,开始今天的内容。
spring中常⽤的设计模式达到九种,我们举例说明。
1、简单⼯⼚模式⼜叫做静态⼯⼚⽅法(StaticFactory Method)模式,但不属于23种GOF设计模式之⼀。
简单⼯⼚模式的实质是由⼀个⼯⼚类根据传⼊的参数,动态决定应该创建哪⼀个产品类。
spring中的BeanFactory就是简单⼯⼚模式的体现,根据传⼊⼀个唯⼀的标识来获得bean对象,但是否是在传⼊参数后创建还是传⼊参数前创建这个要根据具体情况来定。
如下配置,就是在 HelloItxxz 类中创建⼀个 itxxzBean。
<beans><bean id="singletonBean" class="com.itxxz.HelloItxxz"><constructor-arg><value>Hello! 这是singletonBean!value></constructor-arg></ bean><bean id="itxxzBean" class="com.itxxz.HelloItxxz" singleton="false"><constructor-arg><value>Hello! 这是itxxzBean! value></constructor-arg></bean></beans>2、⼯⼚⽅法模式通常由应⽤程序直接使⽤new创建新的对象,为了将对象的创建和使⽤相分离,采⽤⼯⼚模式,即应⽤程序将对象的创建及初始化职责交给⼯⼚对象。
⼀般情况下,应⽤程序有⾃⼰的⼯⼚对象来创建bean.如果将应⽤程序⾃⼰的⼯⼚对象交给Spring管理,那么Spring管理的就不是普通的bean,⽽是⼯⼚Bean。
Spring中常见的设计模式——单例模式⼀、单例模式的应⽤场景 单例模式(singleton Pattern)是指确保⼀个类在任何情况下都绝对只有⼀个实例,并提供⼀个全局访问点。
J2EE中的ServletContext,ServletContextConfig等;Spring中的ApplicationContext、数据库连接池等。
⼆、饿汉式单例模式 饿汉式单例模式在类加载的时候就⽴即初始化,并且创建单例对象。
它是绝对的线程安全、在线程还没出现以前就实现了,不可能存在访问安全问题。
优点:没有增加任何锁,执⾏效率⾼,⽤户体验⽐懒汉式好。
缺点:类加载的时候就初始化了,⽤不⽤都进⾏,浪费内存。
Spring 中IoC容器ApplocationContext本⾝就是典型的饿汉式单例模式:public class HungrySingleton {private static final HungrySingleton h = new HungrySingleton();private HungrySingleton() {}public static HungrySingleton getInstance() {return h;}} 饿汉式单例模式适⽤于单例对象较少的情况。
三、懒汉式单例模式 被外部调⽤才会加载:public class LazySimpleSingleton {private LazySimpleSingleton() {}private static LazySimpleSingleton lazy = null;public static LazySimpleSingleton getInstance() {if (lazy == null) {lazy = new LazySimpleSingleton();}return lazy;}}利⽤线程创建实例:public class ExectorThread implements Runnable {@Overridepublic void run() {LazySimpleSingleton simpleSingleton = LazySimpleSingleton.getInstance();System.out.println(Thread.currentThread().getName() + ":" + simpleSingleton);}}客户端代码:public class LazySimpleSingletonTest {public static void main(String[] args) {Thread t1 = new Thread(new ExectorThread());Thread t2 = new Thread(new ExectorThread());t1.start();t2.start();System.out.println("END");}}结果:ENDThread-1:zySimpleSingleton@298c37fdThread-0:zySimpleSingleton@6ebc1cfd可以看到产⽣的两个实例的内存地址不同说明产⽣了两个实例,⼤家可以通过以下打断点的⽅式实现不同Thread运⾏状态见进⾏切换。
Spring技术内幕——深入解析Spring架构与设计原理(二)AOPAOP联盟定义的AOP体系结构把与AOP相关的概念大致分为了由高到低、从用法到实现的三个层次。
关于这个体系结构,个人的理解是这样的,从上往下,最高层是语言和开发环境,在这个环境中可以看到几个重要的概念:base可以视为待增加对象,或者说目标对象;aspect指切面,通常包含对于base的增加应用;configuration可以看成是一种编织或者说配置,通过在AOP体系中提供这个configuration配置环境,可以把base和aspect结合起来,从而完成切面向目标对象的编织实现。
对Spring平台或者说生态系统来说,AOP是Spring框架的核心功能模块之一。
AOP与IOC容器的结合用法, 为应用开发或者Spring自身功能的扩展都提供了许多方便。
Spring AOP的实现和其他特性的实现一样,十分丰盛,除了可以用法Spring本身提供的AOP实现之外,还封装了业界优秀的AOP解决计划AspectJ来让应用用法。
在这里,主要对Spring自身的AOP实现原理做一些解析;在这个AOP实现中,Spring 充分利用了IOC容器Proxy代理对象以及AOP拦截器的功能特性,通过这些对AOP基本功能的封装机制,为用户提供了AOP的实现框架。
所以,要了解这些AOP的基本实现,需要我们对Java 的Proxy机制有一些基本了解。
AOP实现的基本线索 AOP实现中,可以看到三个主要的步骤,一个是代理对象的生成,然后是拦截器的作用,然后是Aspect编织的实现。
AOP框架的丰盛,很大程度体现在这三个详细实现中,所具有的丰盛的技术挑选,以及如何实现与IOC容器的无缝结合。
究竟这也是一个十分核心的模块,需要满足不同的应用需求带来的解决计划需求。
在Spring AOP的实现原理中,我们主要举ProxyFactoryBean的实现作为例子和实现的基本线索举行分析;很大一个缘由,是由于ProxyFactoryBean是在Spring IoC环境中,创建AOP应用的最底层办法,从中,可以看到一条实现AOP的基本线索。
JAVA各种系统框架图简介1.Spring 架构图Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架.Spring 框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。
Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。
这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。
组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:•核心容器:核心容器提供Spring 框架的基本功能。
核心容器的主要组件是BeanFactory ,它是工厂模式的实现。
BeanFactory 使用控制反转(IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
•Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。
Spring 上下文包括企业服务,例如JNDI 、EJB、电子邮件、国际化、校验和调度功能。
•Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中.所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。
Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中.•Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。
Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。
各种系统架构图及其简介1.Spring架构图Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
Spring框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。
Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。
这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:核心容器:核心容器提供Spring框架的基本功能。
核心容器的主要组件是BeanFactory,它是工厂模式的实现。
BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring框架中。
所以,可以很容易地使Spring框架管理的任何对象支持AOP。
Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。
Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。
Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的JDBC应用做过报道。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计理念,有那几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成Spring的骨骼架构?Spring的AOP特性又是如何利用这些基础的骨骼架构来工作的?Spring中又使用了那些设计模式来完成它的这种设计的?它的这种 设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。
Spring的骨骼架构 Spring总共有十几个组件,但是真正核心的组件只有几个,下面是Spring框架的总体架构图:
图1.Spring框架的总体架构图 从上图中可以看出Spring框架中的核心组件只有三个:Core、Context和Beans。它们构建起了整个Spring的骨骼架构。没有它们就不可能有AOP、Web等上层的特性功能。下面也将主要从这三个组件入手分析Spring。
Spring的设计理念 前面介绍了Spring的三个核心组件,如果再在它们三个中选出核心的话,那就非Beans组件莫属了,为何这样说,其实Spring就是面向Bean的编程(BOP,Bean Oriented Programming),Bean在Spring 中才是真正的主角。 Bean在Spring中作用就像Object对OOP的意义一样,没有对象的概念就像没有面向对象编程,Spring中没有Bean也就没有Spring存在的意义。就像一次演出舞台都准备好了但是却没有演员一样。为什 么要Bean这种角色Bean或者为何在Spring如此重要,这由Spring框架的设计目标决定,Spring为何如此流行,我们用Spring的原因是什么,想想你会发现原来Spring解决了一个非常关键的问题他可以让 你把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。而这个注入关系在一个叫Ioc容器中管理,那Ioc容器中有又是什么就是被Bean包裹的对象。Spring正是通过把对象包装在 Bean中而达到对这些对象管理以及一些列额外操作的目的。
它这种设计策略完全类似于Java实现OOP的设计理念,当然了Java本身的设计要比Spring复杂太多太多,但是都是构建一个数据结构,然后根据这个数据结构设计他的生存环境,并让它在这个环境中 按照一定的规律在不停的运动,在它们的不停运动中设计一系列与环境或者与其他个体完成信息交换。这样想来回过头想想我们用到的其他框架都是大慨类似的设计理念。
核心组件如何协同工作 前面说Bean是Spring中关键因素,那Context和Core又有何作用呢?前面吧Bean比作一场演出中的演员的话,那Context就是这场演出的舞台背景,而Core应该就是演出的道具了。只有他们在一起才能 具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目就是Spring能提供的特色功能了。
我们知道Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对Context来说他就是要发现每个Bean之间的关系,为它们建立这种关系并且要维护好 这种关系。所以Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器,一旦建立起这个Ioc容器后Spring就可以为你工作了。那Core组件又有什么用武之地呢?其实Core就是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。
它们之间可以用下图来表示: 图2.三个组件关系 核心组件详解 这里将详细介绍每个组件内部类的层次关系,以及它们在运行时的时序顺序。我们在使用Spring是应该注意的地方。
Bean组件 前面已经说明了Bean组件对Spring的重要性,下面看看Bean这个组件式怎么设计的。Bean组件在Spring的org.springframework.beans包下。这个包下的所有类主要解决了三件事:Bean的定义、Bean 的创建以及对Bean的解析。对Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由Spring在内部帮你完成了,对你来说是透明的。
SpringBean的创建时典型的工厂模式,他的顶级接口是BeanFactory,下图是这个工厂的继承层次关系:
图4.Bean工厂的继承关系 BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。但是从上图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,他实 现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在Spring内部在操作过程中对象的传递和转化过程中,对对象的 数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。 AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为。
Bean的定义主要有BeanDefinition描述,如下图说明了这些类的层次关系:
图5.Bean定义的类层次关系图 Bean的定义就是完整的描述了在Spring的配置文件中你定义的节点中所有的信息,包括各种子节点。当Spring成功解析你定义的一个节点后,在Spring的内部他就被转化 成BeanDefinition对象。以后所有的操作都是对这个对象完成的。
Bean的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean的解析主要就是对Spring配置文件的解析。这个解析过程主要通过 下图中的类完成: 图6.Bean的解析类 当然还有具体对tag的解析这里并没有列出。 Context组件 Context在Spring的org.springframework.context包下,前面已经讲解了Context组件在Spring中的作用,他实际上就是给Spring提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个 环境是如何构建的。
ApplicationContext是Context的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了五个接口,这五个接口主要是扩展了Context的功能。下面是Context的类结构图:
图7.Context相关的类结构图 从上图中可以看出ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean,另外ApplicationContext继承了ResourceLoader接口,使得ApplicationContext可以访 问到任何外部资源,这将在Core中详细说明。 ApplicationContext的子类主要包含两个方面: ConfigurableApplicationContext表示该Context是可修改的,也就是在构建Context中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的Context,即 AbstractRefreshableApplicationContext类。
WebApplicationContext顾名思义,就是为web准备的Context他可以直接访问到ServletContext,通常情况下,这个接口使用的少。
再往下分就是按照构建Context的文件类型,接着就是访问Context的方式。这样一级一级构成了完整的Context等级层次。
总体来说ApplicationContext必须要完成以下几件事: ◆标识一个应用环境 ◆利用BeanFactory创建Bean对象 ◆保存对象关系表 ◆能够捕获各种事件 Context作为Spring的Ioc容器,基本上整合了Spring的大部分功能,或者说是大部分功能的基础。
Core组件 Core组件作为Spring的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下面就 重要看一下这个部分在Spring的作用。
下图是Resource相关的类结构图: 图8.Resource相关的类结构图 从上图可以看出Resource接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。对资源的提供者来说,如何把资源包装起来交给其他人用这也是一个问题,我们看到Resource 接口继承了InputStreamSource接口,这个接口中有个getInputStream方法,返回的是InputStream类。这样所有的资源都被可以通过InputStream这个类来获取,所以也屏蔽了资源的提供者。另外还有一 个问题就是加载资源的问题,也就是资源的加载者要统一,从上图中可以看出这个任务是由ResourceLoader接口完成,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源, 他的默认实现是DefaultResourceLoader。
下面看一下Context和Resource是如何建立关系的?首先看一下他们的类关系图: