Spring 整体架构

Spring的整体架构

image

(1)Core Container。

Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。
Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。
这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

Core模块主要包含Spring框架基本的核心工具类,Spring的其他组件要都要使用到这个包里的类,Core模块是其他组件的基本核心。
当然你也可以在自己的应用系统中使用这些工具类。

Beans模块是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。

Context模块构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context模块继承了 Beans的特性,为Spring核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。
Context模块同时也支持J2EE的一些特性,例如EJB、JMX和基础的远程处理。ApplicationContext接口是Context模块的关键。

Expression Language 模块提供了一个强大的表达式语言用于在运行时查询和操纵对象。它是 JSP 2.1规范中定义的 unifed expression language的一个扩展。

(2)AOP。

AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。
利用 source-level 的元数据功能,还可以将各种行为信息合并到你的代码中,这有点像.Net技术中的attribute概念。
通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中,所以可以很容易地使Spring框架管理的任何对象支持AOP。
Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Aspects模块提供了对AspectJ的集成支持。
Instrumentation模块提供了 class instrumentation支持和 classloader实现,使得可以在特定的应用服务器上使用。
Spring中最核心的两个类
1.DefaultListableBeanFactory  

    XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是 Spring 注册及加载 bean 的默认实现,
    而对于 XmlBeanFactory 与DefaultListableBeanFactory 不同的地方其实是在 XmlBeanFactory 中使用了自定义的 XML 读取器XmlBeanDefinitionReader,
    实现了个性化的BeanDefinitionReader读取,DefaultListableBeanFactory继承了 AbstractAutowireCapableBeanFactory 
    并实现了 ConfigurableListableBeanFactory 以及BeanDefinitionRegistry接口。 
    
2.XmlBeanDefinitionReader  
    
    XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,那么我们可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络。
容器的基础XmlBeanFactory

循环依赖

循环依赖就是循环引用,就是两个或多个 bean 相互之间的持有对方.
循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。
Spring如何解决循环依赖
1.构造器循环依赖
    表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出 BeanCurrentlyIn CreationException异常表示循环依赖。
2.setter循环依赖
    表示通过setter注入方式构成的循环依赖。对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。
    通过提前暴露一个单例工厂方法,从而使其他bean能引用到该bean。

猜你喜欢

转载自blog.csdn.net/zjltju1203/article/details/89211586