3.Spring的AOP

一、AOP(Aspect-oriented programming,面向切面编程):

什么是AOP?

定义:将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。

二、AOP核心概念

1、Aspect(切面)

切面,是对交叉业务逻辑的统称。

2、Joinpoint(连接点)

连接点,指切面可以织入到目标对象的位置(方法,属性等)。

3、Advice(通知)

通知,指切面的具体实现。

4、Pointcut(切入点)

切入点,指通知应用到哪些类的哪些方法或属性之上的规则。

5、Introduction(引入)

引入,指动态地给一个对象增加方法或属性的一种特殊的通知。

6、Weaving(织入)

织入,指将通知插入到目标对象。

7、Target(目标对象)

目标对象,指需要织入切面的对象。

8、Proxy(代理对象)

代理对象,指切面织入目标对象之后形成的对象。

三、Spring AOP原理

采用动态代理模式。

Spring AOP采用动态代理的过程:

(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;

(2) 目标对象如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;

(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP。

四、Spring的通知

1、Spring的通知类型

(1) MethodBeforeAdvice

类全名:org.springframework.aop.MethodBeforeAdvice

在方法调用之前,做处理。

不能够改变返回值

不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(2) AfterReturningAdvice

类全名:org.springframework.aop.AfterReturningAdvice

在方法调用之后,做处理。

不能够改变返回值

不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(3) MethodInterceptor

类全名:org.aopalliance.intercept.MethodInterceptor

在方法调用之前以及之后,做处理。

可以改变返回值,也可以改变流程。

(4) ThrowsAdvice

类全名:org.springframework.aop.ThrowsAdvice

在方法抛出异常后,做处理。

当该通知处理完异常后,会简单地将异常再次抛出给目标调用方法。

2、配置过程:

(1)配置目标对象

(2)配置通知

(3)利用ProxyFactoryBean将通知织入到目标对象,形成一个动态代理对象

(4)客户端使用动态代理来访问目标对象的方法。

在默认情况下,通知会应用到所有的方法之上。

Pointcut:

根据方法和类决定在什么地方织入通知

Advisor:

将Pointcut与Advice结合到一起。

自定义切入点:

步骤:

1)实现org.springframework.aop.ClassFilter

2)实现org.springframework.aop.MethodMatcher

3)实现org.springframework.aop.Pointcut

4)实现org.springframework.aop.PointcutAdvisor

注意:

在此可定义

private Advice advice;

private Pointcut pointcut;

在配置文件中,将自定义的切入点与通知绑订到一起

5)利用ProxyFactoryBean将advisor织入到目标对象

ProxyFactoryBean的作用:

依照配置信息,将切面应用到目标对象,生成动态代理对象。

(1) Spring只支持方法连接点,不支持属性连接点。

(原因是Spring AOP采用的是动态代理模式,而动态代理本身就是在方法调用前加入代码。)

(2) Spring只在运行时,将切面织入到目标对象。

(有些AOP实现,可以在编译是织入切面到目标对象。)

Injecting Advice(con’t d)

<bean id=”registerService’ class=”org.springframework.aop.framework.ProxyFactoryBean”>

<property name=”proxyInterfaces”>  ←目标对象实现的接口

(如果没有定义接口,则所有方法使用CGLib

<value>aop.RegisterService</value>

</proxy>

<property name=”target”>    ←目标对象

<ref local=”registerServiceTarget”/>

</property>

<property name=”interceptorNames”> ←需要织入到目标对象的切面

<list>

<value>logAdvice</value>

<value>throwsAdvice</value>

</list>

</property>

</bean>

五、切入点(Pointcut)

1、Pointcut<interface>

切入点是指通知/切面可以应用到哪些类,哪些方法之上。

Pointcut API

Pointcut:org.springframework.aop.Pointcut

对某些类某些方法应用切面。

Classfilter:org.springframework.aop.ClassFilter

用来过滤类(哪些类可以应用切面)

MethodMather:org.springframework.aop.MethodMatcher

用来过滤方法(类中哪些方法应用切面)

Advisor:org.springframework.aop.PointcutAdvisor

将Pointcut与Advice结合到一起

配置文件样例:

<beans>

<bean id="registerServiceTarget" class="aop5.RegisterService"/>

<bean id="logAdvice" class="aop5.LogAdvice"/>

<bean id="myPointcut" class="aop5.MyPointcut"/>

<bean id="myPointcutAdvisor" class="aop5.MyPointcutAdvisor">

<property name="advice">

<ref local="logAdvice"/>

</property>

<property name="pointcut">

<ref local="myPointcut"/>

</property>

</bean>

<bean     id="registerService" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target">

<ref local="registerServiceTarget"/>

</property>

<property name="interceptorNames">

<list>

<value>myPointcutAdvisor</value>

</list>

</property>

</bean>

</beans>

2、预定义切入点

① 静态切入点:

a、NameMatchMethodPointAdviosr

org.springframework.aop.support.NameMatchMethodPointcutAdvisor

根据方法名称的特点进行匹配

核心XML:mappedName→advice(ref)

配置文件样例:

<beans>

<bean id="registerServiceTarget" class="aop6.RegisterService" />

<bean id="logAdvice" class="aop6.LogAdvice" />

<bean        id="namedPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">

<property name="mappedName">

<value>methodOne</value>

</property>

<property name="advice">

<ref local="logAdvice"/>

</property>

</bean>

<bean id="registerService"

class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target">

<ref local="registerServiceTarget" />

</property>

<property name="interceptorNames">

<list>

<value>namedPointcutAdvisor</value>

</list>

</property>

</bean>

</beans>

b、RegexpMethodPointcutAdvisor

根据正则表达式匹配方法名

org.springframework.aop.support.RegexpMethodPointcutAdvisor

核心XML:pattern→advice(ref)

配置文件样例:

<beans >

<bean id="registerServiceTarget" class="aop6.RegisterService" />

<bean id="logAdvice" class="aop6.LogAdvice" />

<bean        id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="pattern">

<value>.*method.*</value>

</property>

<property name="advice">

<ref local="logAdvice"/>

</property>

</bean>

<bean id="registerService"

class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target">

<ref local="registerServiceTarget" />

</property>

<property name="interceptorNames">

<list>

<value>regexpAdvisor</value>

</list>

</property>

</bean>

</beans>

②  动态切入点:

org.springframework.aop.support.ControlFlowPointcut

③ 切入点的交叉与合并:

Pointcuts.union

配置文件样例:

<bean id="unionPointcut" class="aop7.UnionPointcut">

<property name="pointcuts">

<list>

<ref local="myPointcut"/>

<ref local="otherPointcut"/>

</list>

</property>

</bean>

<bean id="myPointcutAdvisor" class="aop7.MyPointcutAdvisor">

<property name="advice">

<ref local="logAdvice"/>

</property>

<property name="pointcut">

<ref local="unionPointcut"/>

</property>

</bean>

④ Introduction

一种特殊类型的Advice,为类动态增加方法和属性。

编程步骤:

1)实现org.springframework.aop.IntroductionInterceptor或

继承org.springframework.aop.support.DelegatingIntroductionInterceptor

2)使用org.springframework.aop.support.DefaultIntroductionAdvisor

配置文件样例:

<bean id="myIntroInterceptor" class="aop8.MyIntroductionInterceptor"/>

<bean          id="myIntroInterceptorAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">

<constructor-arg>

<ref local="myIntroInterceptor"/>

</constructor-arg>

<constructor-arg>

<value>aop8.OtherBean</value>

</constructor-arg>

</bean>

六、自动代理

Spring在生成代理对象的时候,默认情况下,会使用被代理对象的接口来生成代理对象。

如果被代理对象没有实现接口,此时,Spring会使用CGLIB生成代理对象,此时该代理对象是被代理对象的子类。

a、BeanNameAutoProxyCreator

org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

根据类的名称来为符合相应名称的类生成相应代理对象。

beanNames(list),interceptorNames

配置文件样例:

<bean        id="namedProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<list>

<value>someService</value>

<value>otherService</value>

</list>

</property>

<property name="interceptorNames">

<list>

<value>logAdvice</value>

</list>

</property>

</bean>

b、DefaultAdvisorAutoProxyCreator

org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator

自动将Advisor与匹配的Bean进行绑定

只能与Advisor配合使用

配置文件样例:

<bean          id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

Spring知识点总结大全(2)的更多相关文章

  1. Spring知识点总结大全(1)

    1.Spring的分层结构 1.Presentation layer(表示层) (1) 表示逻辑(生成界面代码) (2) 接收请求 (3) 处理业务层抛出的异常 (4) 负责规则验证(数据格式,数据非 ...

  2. Spring知识点回顾(08)spring aware

    Spring知识点回顾(08)spring aware BeanNameAware 获得容器中的bean名称 BeanFactoryAware 获得当前的bean factory Applicatio ...

  3. Spring知识点回顾(07)事件发布和监听

    Spring知识点回顾(07)事件发布和监听 1.DemoEvent extends ApplicationEvent { public DemoEvent(Object source, String ...

  4. Spring知识点回顾(01)Java Config

    Spring知识点回顾(01) 一.Java Config 1.服务和服务注入 2.Java 注解 :功能更强一些 3.测试验证 二.注解注入 1.服务和服务注入 2.配置加载 3.测试验证 三.总结 ...

  5. Spring Boot学习大全(入门)

    Spring Boot学习(入门) 1.了解Spring boot Spring boot的官网(https://spring.io),我们需要的一些jar包,配置文件都可以在下载.添置书签后,我自己 ...

  6. Spring知识点复习

    Spring知识点复习 一.专业术语 侵入式设计 引入框架,对现有的类的结构有影响,即需要实现或继承某些特定类.如:Struts框架 非侵入式设计 引入框架,对现有的类结构没有影响.如:Hiberna ...

  7. <转>Spring 知识点提炼

    Spring 知识点提炼 1. Spring框架的作用 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依 ...

  8. Spring Boot配置文件大全

    Spring Boot配置文件大全 ############################################################# # mvc ############## ...

  9. Spring Boot注解大全,一键收藏了!

    本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天是猿灯塔“365天原创计划”第5天. 今天呢!灯塔君跟大家讲: Spring Boot注解大全 一.注解(annotations)列表 @Spr ...

随机推荐

  1. Maven打包跳过测试

    运行mvn install时跳过Test 方法一: <project> [...] <build> <plugins> <plugin> <gro ...

  2. Winform窗体关闭时判断是否关闭

    在窗体的关闭事件FormClosing中进行判断,FormClosing事件每当用户关闭窗体时,在窗体已关闭并指定关闭原因前发生. private void Form1_FormClosing(obj ...

  3. AJAX避免服务器调用上个页面缓存的办法

    GET 请求 一个简单的 GET 请求: xmlhttp.open("GET","demo_get.asp",true); xmlhttp.send(); 亲自 ...

  4. [转载]卡尔曼滤波器及其基于opencv的实现

    卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...

  5. ueditor使用canvas在图片上传前进行压缩

    之前就看到H5使用canvas就可以在前端使用JS压缩图片,这次接到任务要把这个功能嵌入到ueditor里面去,以节省流量,减轻服务器压力. H5使用canvas进行压缩的代码有很多,核心原理就是创建 ...

  6. libpng安装与配置(Win7+VS2010)

    一.下载 libpng:http://libmng.com/pub/png/libpng.html zlib:http://www.zlib.net/ IDE:VS2010 二.编译 将下载的两个zi ...

  7. 树莓派 3 alsa 声卡驱动

    /boot/config.txt dtparam=i2c_arm=on,audio=on

  8. Nodejs中Async模块的流程控制方法

    首先,使用Asycn模块需要安装,它不是node自带的.其次,该模块有大约20多个流程控制方法,我们在这里仅分析常用的series, parallel, waterfall, auto这四种,并且尽量 ...

  9. C语言file相关函数学习

    1.errno_t fopen_s( FILE** pFile, const char *filename, const char *mode ); 注:fopen_s能过创建文件,但无法创建目录 打 ...

  10. winform空间批量控制

    第一版: private void RefreshControl(PanelEx panel, bool enabled, bool isClear) { ; i < panel.Control ...