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. 泛型(Generic)

    本质:限制集合类型 我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数T仅仅是一个Object类型,任何具体类型信息我们都是未知的. 小例子: package day02.generic; i ...

  2. memcached tomcat maven 学习记录

    2016.12.11 maven 快速搭建项目,只要有pom.xml文件配置好依赖 可以把项目切割(具体切割出来的块怎么用?) nginx 负载均衡  文件服务器 主要配置nginx.conf 文件 ...

  3. Winform 窗体单例

    有窗体Form1和窗体Form2,单击Form1上按钮,只弹出一个Form2. Form2里自定义一个方法,里面判断是否弹出Form2,没有时弹出Form2. public static Form2 ...

  4. MVC开发基础

    新建--项目--ASP.NET MVC 4 WEB 应用程序 MVC: M--Model  模型层     放置数据访问类,linq V--View  视图层       界面层   aspx文件.只 ...

  5. Lucene 工作原理 之倒排索引

      1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排 ...

  6. datasnap的初步 生命期LifeCycle

    datasnap的初步 生命期LifeCycle   TDSServerClass有一个属性LifeCycle,这个属性有三个值,很好理解1.Session,这是默认值.就是一个连接,一个Sessio ...

  7. 查看表的datapages

    select object_name(i.object_id) as tableName,data_pages as dataPagesfrom sys.indexes as ijoin sys.pa ...

  8. 《IT蓝豹》吹雪花demo,学习android传感器

    吹雪花demo,学习android传感器 吹雪花demo,学习android传感器,嘴巴对着手机底部吹一下就会出现飘着雪花效果. 算是学习android传感器效果.本例子主要是通过android.me ...

  9. 1.springMVC+spring+Mybatis的整合思路

    SSM整合的过程:就是把一些东西交给spring管理,也就是添加配置文件的一个过程.那么有哪些东西我们要交给spring管理呢?大概有以下几个: 1.数据源(可配置数据库连接池) 2.SqlSessi ...

  10. yum源使用(转)

    一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...