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. jq实现全选、全不选、反选

    基本思路: 1全选:点击全选按钮的时候,将input的属性checked设置为true; 2全不选:点击全不选按钮的时候,将input的属性checked设置为false; 3反选:点击反选按钮的时候 ...

  2. VUE 入门基础(8)

    十,组件 使用组件 注册 可以通过以下这种方式创建一个Vue实例 new Vue({ el: '#some-element', }) 注册一个全局组件,你可以使用Vue.component(tagNa ...

  3. node代码片段

    /** * Created by Administrator on 2016/8/22 0022. * chat */ var net=require('net'); var chatServer=n ...

  4. 利用Aspose.Pdf将扫描的电子书修改为适合在kindle上查看

    很多扫描版的电子书,留有很大的页边距,大屏的设备看起来没有啥影响,可是在kindle上看起来就麻烦了,放大操作简直就没法用,最好能把留白去掉. 将pdf文件转换为图片这个看看 例子里的 JpegDev ...

  5. hadoop-2.2.0 的编译安装及HA配置

    一 准备工作 准备工作中要求有 1.centOs 6.4,添加hadoop用户,配置集群内的/etc/hosts文件. 2.安装hadoop用户的ssh,并打通集群内所有机器,(ha执行fencing ...

  6. VC++ 迭代器 iterator, const_iterator, const iterator

    迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...

  7. matlab神经网络实验

    第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  ...

  8. yum阿里云镜像源

    阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源.阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ CentOS系统更换软 ...

  9. 《转》iOS音频视频初级开发

    代码改变世界 Posts - 73, Articles - 0, Comments - 1539 Cnblogs Dashboard Logout HOME CONTACT GALLERY RSS   ...

  10. asp.net LINQ LinqDataSource控件显示数据和DropdownList显示数据

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...