spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

spring核心

Spring一共有十几个组件,但是真正的核心组件只有几个,我们一起来看下Spring框架的总体架构图,了解一下他的体系结构。
从这个图中我们可以看出Spring框架的核心组件只有三个:Core、Context和Beans。他们构建起了整个Spring的骨骼架构,没有他们就不可能有AOP、Web等上层的特性功能。上面这些是Spring特性功能。。我列举了比较重要的几个包:AOP包(主要提供面向切面编程的实现),Web(主要提供了Web应用开发的支持及针对Web应用的MVC思想实现) 、ORM(为我们之前学的Hibernate,以及以后会学到的Mybatis这类持久化框架提供支持)、还有Spring MVC(这个是它自带的一个web视图层,可以替代到Sturts2,将来我们还会详细的学习这个SpringMVC框架)。。等等,其中最最核心的就是AOP和下面Spring核心包,也是我们学习的重点。

spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
前面介绍了Spring三个核心组件(Core、Context、Beans)。如果再再他们三个中选一个核心来,那就非Beans莫属了,为何这样说?其实Spring就是面向Bean的变成(BOP,Bean Oriented Programming),Bean才是Spring中的真正主角。
Spring就是面向Bean的编程,在Spring中所有对象都可以看成一个Bean。

Bean在Spring 中作用就像Object对OOP的意义一样,没有对象的概念就没有面向对象编程,Spring中没有Bean也就没有Spring存在意义。就像一次演出舞台都准备好了但是却没有演员一样。为什么要Bean这种角色?或者说Bean在Spring中如此重要,这都是由Spring框架的设计目标决定的,Spring为何如此流行,我们使用Spring的原因是什么?思考下,你会发现原来Spring解决了一个非常关键的问题,他可以让你把对象之间的关系转而使用配置文件来管理,也就是他的依赖注入机制,而这个注入关系在一个叫Ioc的容器中管理。Spring正是通过把对象包装在Bean中从而达到对这些对象管理以及一系列额外操作的目的。

他的这种设计策略完全类似于Java实现OOP的设计理念,当然Java本身的设计要比Spring复杂太多太多,但是都是构建一个数据结构,然后根据这个数据结构设计他的生存环境,并让在这个环境后总按照一定得规律在不停的运动,在他们的不停运动中高设计一系列与环境或者其他个体完成信息交换。这样想来,我们用到过的其他框架都是大概类似的设计理念

那这些核心组件如何协同工作?
前面说Bean是Spring中的关键因素,那Context和Core又有何作用?前面把Bean比作一场演出中的演员的话,那么Context就是这场演出的舞台背景,而Core就是应该是演出的道具了。只有他们在一起才能具备演出一场好戏的最基本条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的经餐,这些节目就是Spring提供的特色功能了。

那它是怎么管理这些Bean的呢?
Spring把所有的Bean及它们之间的依赖关系以配置文件的方式组装起来,在一个叫IoC(Inversion of Control)的容器中进行管理,这也就是Spring的核心设计思想之一依赖注入机制,Spring的另一个核心设计思想叫做AOP,这两个概念在后续专题会有详细讲解,这里就不在赘述。

通过集成实现的接口就知道他具有spring里面经典的工厂方法,还有对国际化支持的Message,以及配置信息的Resource,还有spring支持的发布和监听事件功能。一个Context基本上把spring具有的核心功能都包裹起来了,那么这就是spring框架运行需要的环境,也就是常说的上下文。任何一个框架运行都通过一个类来进行描述它执行时的环境,ServletContext也是一样,就是Servlet环境信息。可以将context理解为一个框架执行信息的载体,可以理解问一个框架的门面(门面模式),将框架内部的各个组件信息都通过一个context暴露给外部。

上下文模块建立在由核心和bean模块提供的坚实基础上,他是访问定
义和配置的任何对象的媒介。ApplicationContext接口是上下文模块
的重点。contet
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
总结spring的优点,准备具体介绍Spring核心内容IoC和AOP:
总结起来,Spring作为一个开源的轻量级的IOC和AOP容器框架,具有以下优点:
1、低侵入式设计:非入侵式设计,基于Spring开发的应用一般不依赖于Spring的类
2、独立于各种应用服务器,真正实现:一次编写,到处运行。
3、Spring的依赖注入特性使Bean与Bean之间的依赖关系变的完全透明,降低了耦合度:使用SpringIOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
4、它的面向切面编程特性允许将一些通用任务如安全、事务、日志等进行集中式处理
5、并且它还提供了与第三方持久层框架的良好整合,并简化了底层数据库访问
6、高度的开放性(可以和Struts2、Hibernate、MyBatis、CXF等很多主流第三方框架无缝整合)

总的来说,Spring确实是一个令每个开发人员都值得学习的开发工具。接下来,我们就一起在学习过程中体会他的魅力吧。
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
当某个角色(比如一个java示例,调用者)需要另一个角色(另一个java示例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的示例。但是在spring里,创建被调用者的工作不再由调用者来完成。因此被称为控制反转;创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也称为依赖注入。这样给程序带来很大的灵活性,这样也实现了我们的接口和实现的分离。
简而言之也就是说我们要获得一个对象,不由我们开发者自己创建,而是由我们的容器来注入给我们的程序来使用.
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

这个例子很好 我做有详情步骤 点我

spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

面向切面编程(AOP)

spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术
我们通过动态代理实现AOP(采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行)
AOP是一种思想,它与具体的实现技术无关,任何一种符合AOP的思想的技术实现,都可以看做是AOP的实现。通过java的动态代理机制,就可以很容易实现AOP的思想,实际上Spring的AOP也是建立在Java的代理机制上。
——我们发现AOP实际上是由目标类的代理类实现的。AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但是AOP代理中的方法与目标对象的方法存在差异,AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。

总结下对AOP理解:
业务处理的主要流程就是核心关注点,与之关系不大的部分就是横切关注点。横切关注点的一个特点就是:他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

增强(Adivce):又翻译成通知,定义了切面是什么以及何时使用,描述了切面要完成的工作和何时需要执行这个工作。是织入到目标类连接点上的一段程序代码。增强包含了用于添加到目标连接点上的一段执行逻辑,又包含了用于定位连接点的方位信息。( 所以spring提供的增强接口都是带方位名: BeforeAdvice、(表示方法调用前的位置)AfterReturninAdvice、(表示访问返回后的位置)ThrowAdvice等等,所以只有结合切点和增强两者一起才能确定特定的连接点并实施增强逻辑
切入点(Pointcut):Advice定义了切面要发生“故事”和时间,那么切入点就定义了“故事”发生的地点。例如某个类或者方法名,Spring中允许我们使用正则来指定。
连接点(Joinpoint):切入点匹配的执行点称作连接点。如果说切入点是查询条件,那连接点就是被选中的具体的查询结果。程序执行的某个特定位置,程序能够应用增强代码的一个“时机”,比如方法调用或者特定异常抛出
切面(Aspect):切点和增强组成切面。它包括了横切逻辑的定义,也包括了连接点的定义。Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中
代理(Proxy):AOP框架创建的对象。一个类被AOP织入增强之后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。
目标对象(Target):增强逻辑的织入的目标类
织入(Weaving):将增强添加到目标类具体连接点上的过程。AOP有三种织入的方式:编译期织入、类装载期织入、动态代理织入(spring采用动态代理织入)

图-》更好理解:在一个多或多个连接点上,可以将切面的功能(advice)织入到程序的执行过程中
说明:
切面可以理解为由增强处理和切入点组成,既包含了横切逻辑的定义,也包含了连接点的定义。面向切面编程主要关心两个问题,即:在什么位置,执行什么功能。Spring AOP是负责实施切面的框架,即由Spring AOP完成织入工作。
Advice直译为“通知”,但这种叫法并不确切,在此处翻译成“增强处理”更便于大家理解。
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

为项目添加Spring的AOP支持
spring-aop-3.2.13.RELEASE.jar
aopalliance-1.0.jar
aspectjweaver-1.6.9.jar
cglib-nodep-2.1.3.jar(已内联在Spring core中)
编写目标方法和增强处理
在Spring配置文件中定义切入点
在切入点织入增强处理

spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
UserServiceLogger类中定义了before( )和afterReturning( )两个方法。我们希望把before( )方法作为前置增强使用,即将该方法添加到目标方法之前执行;afterReturning( )方法作为后置增强使用,即将该方法添加到目标方法正常返回之后执行。这里先以前置增强和后置增强为例,其他增强类型会在后续章节中进行介绍。
为了能够在增强方法中获得当前连接点的信息,以便实施相关的判断和处理,可以在增强方法中声明一个JoinPoint类型的参数,Spring会自动注入该实例。通过该实例的getTarget( )方法可以得到被代理的目标对象,getSignature( )方法返回被代理的目标方法,getArgs( )方法返回传递给目标方法的参数数组。对于实现后置增强的afterReturning( )方法,还可以定义一个参数用于接收目标方法的返回值。
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

配置切入点的标签aop:pointcut。aop:pointcut的expression属性可以配置切入点表达式
切入点表达式支持模糊匹配,讲解几种常用的模糊匹配
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

将增强处理和切入点结合在一起,在切入点处插入增强处理,完成"织入"
在aop:config中使用aop:aspect引用包含增强方法的Bean。然后分别通过aop:before和aop:after-returning将方法声明为前置增强和后置增强,在aop:after-returning中可以通过returning属性指定需要注入返回值的属性名。方法的JoinPoint类型参数无须特殊处理,Spring会自动为其注入连接点实例。
很明显UserService的addNewUser( )方法可以和切入点pointcut相匹配,Spring会生成代理对象在它执行前后分别调用before( )和afterReturning( )方法,这样就完成了日志输出。
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知
spring核心、面向切面编程(AOP)---初学spring相关特点概念----1须知

此处开胃菜更多内容请看下一期