spring

1.spring概述

Spring是一个开源框架。在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。Spring最早由Rod Jonhnson创建,是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。随着,Spring不断的发展与壮大,已经形成了一套成熟生态。

Spring可以做非常多的事情,但追溯最根本的使命是:简化Java开发。Spring的目标是致力于全方位的简化Java开发,Spring采用了4种关键策略:

1)基于POJO的轻量级和最小侵入性编程;

1.不好的做法:一些框架通过强迫应用继承它的类或实现它的接口从而导致应用与框架绑死。

2.Spring:竭力避免因自身的API而弄乱应用代码.不会强迫实现Spring规范的接口或继承类,最差的情况也只是使用Spring注解.

2)通过依赖注入和面向接口实现松耦合;

Spring通过依赖注入来装配POJO,使应用对象彼此之间保持松散耦合。

1.耦合具有两面性:一方面高耦合会让代码难以测试、复用、理解。另一方面一定程度的耦合又是必须的,不同的类必须以适当的方式进行交互。

2.通过依赖注入,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,依赖关系将自动注入到需要它们的对象当中去。Spring一般通过xml或注解的方式来进行配置。

3)基于切面和惯例进行声明式编程;

1.应用切面:面向切面编程允许把遍布应用各处的功能分离出来形成可重用的组件。一般定义为促使软件系统实现关注点的分离的一项技术。系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,还额外承担着如日志、事务管理和安全这样的系统服务,这些系统服务通常称为横切关注点,因为它们会跨越系统的多个组件。

系统服务他布在各个组件中,会让这些关注点代码重复,同时会让组件代码变得复杂。

2.AOP:使用这些系统服务模块化,并以声明的方式应用到需要的组件中去。组件更加关注自身的业务,提高组件的内聚性。

4)通过切面和模板减少样板式代码;

2.Spring IoC

Spring是面向 Bean 的编程。Spring 通过把对象包装在 Bean 中达到对这些对象生命周期的管理,IoC容器负责容纳bean,并对bean进行管理。BeanFactory是IoC容器的核心接口,是Spring IoC容器的实际代表者。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

1)XmlBeanFactory

XmlBeanFactory实现表示以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

Spring IoC容器读取配置元数据,并通过它对应用中各个对象进行实例化、配置以及组装。

基于XML的元数据是常用的配置元数据格式。还有如本地文件系统、Java CLASSPATH等。

2)bean

定义:与应用程序中实际使用的对象一一对应。通常情况下bean的定义包括:服务层对象、数据访问层对象、表示层对象、Hibernate SessionFactory对象、JMS Queue对象等等。

bean定义由BeanDefinition 对象来表示,该定义将包含以下信息:

1、全限定类名:这通常就是已定义bean的实际实现类。

2、bean行为的定义,这些定义将决定bean在容器中的行为(作用域、生命周期回调等等)。

3、对其他bean的引用,这些引用bean也可以称之为协作bean 或依赖bean。

4、创建bean实例时的其他配置设置。比如使用bean来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。

实例化bean:1、用构造器来实例化;2、使用静态工厂方法实例化;3、使用实例工厂方法实例化。从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory 我们可以访问bean定义。

实现:依赖注入(DI)背后的基本原理是对象之间的依赖关系只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。

Spring容器的工作就是创建bean时注入那些依赖关系。DI主要有两种注入方式,即Setter注入和构造器注入

在大部分情况下,容器中的bean都是singleton类型的。如果一个singleton bean要引用另外一个singleton bean,或者一个非singleton bean要引用另外一个非singleton bean时,通常情况下将一个bean定义为另一个bean的property值就可以了。不过对于具有不同生命周期的bean来说这样做就会有问题了,比如在调用一个singleton类型bean A的某个方法时,需要引用另一个非singleton(prototype)类型的bean B,对于bean A来说,容器只会创建一次,这样就没法在需要的时候每次让容器为bean A提供一个新的的bean B实例。

上述问题的一个解决办法就是放弃控制反转。另一种方法是Lookup方法注入,它利用了容器的覆盖受容器管理的bean方法的能力,从而返回指定名字的bean实例(内部机制是Spring利用了CGLIB库在运行时生成二进制代码功能,通过动态创建Lookup方法bean的子类而达到复写Lookup方法的目的)。还有一种很少用到的方法注入形式,该注入能使用bean的另一个方法实现去替换自定义的方法。

3.Spring AOP

AOP即面向切面编程,可以说是OOP面向对象编程的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。OOP适合定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

4.AOP核心概念

1、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。

2、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象。

3、连接点(joinpoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

4、切入点(pointcut):对连接点进行拦截的定义。

5、通知(advice):指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。

6、目标对象:代理的目标对象。

7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程。

8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。

5.Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。

Spring创建代理的规则为:1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB。

AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:

1、定义普通业务组件

2、定义切入点,一个切入点可能横切多个业务组件

3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作

所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。

6.Spring核心组件

Bean 组件在 Spring 的 org.springframework.beans 包下。这个包下的所有类主要解决了三件事:Bean的定义、Bean的创建以及对Bean的解析。对 Spring的使用者来说唯一需要关心的就是 Bean的创建,其他两个由Spring在内部帮你完成了,对你来说是透明的。

1)核心组件如何协同工作

Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context 要解决的问题,对 Context 来说他就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。其实 Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具。

2)Bean 组件

Bean 组件在 Spring 的 org.springframework.beans 包下。这个包下的所有类主要解决了三件事:Bean的定义、Bean的创建以及对Bean的解析。对 Spring的使用者来说唯一需要关心的就是 Bean的创建,其他两个由Spring在内部帮你完成了,对你来说是透明的。

Bean的创建时典型的工厂模式,他的顶级接口是 BeanFactory。BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。

Bean的定义主要有 BeanDefinition 描述,Bean 的定义就是完整的描述了在 Spring 的配置文件中你定义的 节点中所有的信息,包括各种子节点。当 Spring 成功解析你定义的一个 节点后,在 Spring 的内部他就被转化成 BeanDefinition 对象。以后所有的操作都是对这个对象完成的。Bean 的解析主要就是对 Spring 配置文件的解析。

3)Context 组件

Context 在 Spring 的 org.springframework.context 包下,他实际上就是给 Spring 提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环境是如何构建的。

ApplicationContext 是 Context 的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了五个接口,这五个接口主要是扩展了 Context 的功能。通过 Context 的类结构图可以看出 ApplicationContext 继承了 BeanFactory,这也说明了 Spring 容器中运行的主体对象是 Bean,另外 ApplicationContext 继承了 ResourceLoader 接口,使得 ApplicationContext 可以访问到任何外部资源。

ApplicationContext 的子类主要包含两个方面:

1.ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 类。

2.WebApplicationContext,就是为web准备的Context他可以直接访问到ServletContext。

总体来说 ApplicationContext 必须要完成以下几件事:1标识一个应用环境;2利用 BeanFactory 创建 Bean 对象;3保存对象关系表; 4能够捕获各种事件。

Context 作为 Spring 的 Ioc 容器,是大部分功能的基础。

4)Core 组件

Core 组件作为 Spring 的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。Resource接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。Resource接口继承了InputStreamSource接口,这个接口中有个getInputStream方法,返回的是InputStream类。这样所有的资源都被可以通过 InputStream 这个类来获取,所以也屏蔽了资源的提供者。资源的加载者的统一,这个任务是由ResourceLoader接口完成,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是 DefaultResourceLoader。
————————————————
版权声明:本文为CSDN博主「chentian114」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chentian114/article/details/102924823

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值