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. Web前端框架汇总

    在做web开发的时候难免遇到一个问题,那就是,选择什么样的框架.下面把前端的框架简单的列一下. 1.flex Apache基金会今天发布了Flex 4.8版本,这是Adobe将Flex捐献给Apach ...

  2. vim中替换命令

    在VIM中进行文本替换:       1.  替换当前行中的内容:    :s/from/to/    (s即substitude)         :s/from/to/     :  将当前行中的 ...

  3. Jenkins 插件开发笔记

    笔记云盘下载链接: https://pan.baidu.com/s/1gfohF1p 密码: v759

  4. 网络存储技术(3) based on zt

    各种术语介绍 一   ESCON    1991 年,IBM公司在S/390服务器中推出了ESCON(Enterprise System Connection)技术.它是基于光纤介质,最大传输速率达1 ...

  5. C# 获取系统时间及时间格式

    --DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 取当前年月日时分秒      currentTime=System. ...

  6. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

  7. bootstrap style for jQuery UI Dialog

    页面引用: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  8. CSS基础01

    1.line-height:设置每行的高度,默认是会以文字的高度来决定 2.text-align:设置文本的对齐方式 3.vertical-align: sub 垂直对齐文本的下标. super 垂直 ...

  9. raw,cow,qcow,qcow2镜像的比较

    在linux下,虚拟机的选择方式有很多,比如vmware for linux,virtual box,还有qemu,在以前,使用qemu的人不多,主要是使用起来有些麻烦,但现在随着Openstack的 ...

  10. extjs ajax java简单精美验证码实现 有图

    前端:利用ExtJs的autoEl功能加载图片. var imgCheckValid = new Ext.create('Ext.Component',{ width: 70, //图片宽度 heig ...