AOP概念

AOP(Aspect-Oriented Programming,面向切面编程),AOP是OOP(面向对象编程)的补充和完善 AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离”

AOP的概念和术语

切面(Aspect) 事务处理,日志

连接点(Joinpoint) 方法调用,异常处理

通知(Advice) around,before,拦截器

切入点(Pointcut)匹配连接点的表达式

引入(Introduction)增加方法或者字段

目标对象(Target Object) 代理对象

AOP代理(AOP Proxy) 框架产生的对象,包括Advice

织入(Weaving) Aspect连接到其他对象

AOP代理是AOP框架创建的对象。 Spring有两种代理方式:默认使用JDK动态代理实现AOP代理,主要用于代理接口;CGLIB代理,实现类的代理,而不是接口

SpringAOP管理

首先引入AOP命名空间

<beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

</beans>

Spring的切入点(joinpoint)

切入点是可以触发处理的连接点集合 同一个切入点可触发不同的处理 可以判断触发哪些处理,即哪些方法可以触发AOP代理。

切入点表达式

切入点指示符:如execution

布尔运算符:AND(&&)、OR(||)和NOT(!)

通配符:星号(*),用于匹配任何方法、类名或者参数类型。

双点号(..),用于表示0个或者多个参数类型。

方法可见性修饰符:如public的。

方法返回类型:如void、int、String等*表示所有类型。

类名:指定完整的类名 ,缩小到某个目标类。

方法名称:可以是全名。如get*,即所有名称以get开头的方法。

如:execution( public void com.biz.impl.PhoneBizImpl.*Phone(int) )表示的就是当public void com.biz.impl.PhoneBizImpl类下的*Phone(int)方法被调用执行时触发AOP代理类

Spring的切面Aspect

系统中抽象出来的的某一个系统服务功能模块,日志管理模块

用一个POJO 类来表示抽象的切面, 用方法表示通知,也可以说是切入点切入的类

在使用之前需要实例化该切面类

<bean id="logAspectBean" class=“….LogAspect"></bean>

Spring中存在5种通知(advice)

Before:在目标方法被调用之前调用(前置通知)

AfterReturning:在某连接点正常完成后执行的通知(后置通知)

After:当某连接点退出的时候执行的通知(最终通知)

Throws:当目标方法抛出异常时调用(异常通知)

Around:拦截对目标对象方法的调用(环绕通知)

通知方法获取目标类的方法使用joinpoint对象

public void before(JoinPoint jp) throws Throwable{

Object[] args = jp.getArgs();// 目标方法所有参数

String methodname=jp.getSignature().getName();//获取目标方法名称

if("buyPhone".equals(methodname)) {

System.out.println("日志:"+currentTime()+“ 即将执行进货操作,数量为 "+args[0]+" 部");

}

JoinPoint对象提供了如下方法以获得连接点

Object[] getArgs():返回方法参数

Signature getSignature():返回方法签名

getModifiers()方法可以得到方法修饰符。

String getKind():返回当前连接点的类型,

Object getTarget():返回连接点所在的目标对象。

Object getThis():返回AOP自动创建的代理对象

值得注意的是,在使用环绕通知的时候使用ProceedingJoinPoint对象pjp

使用pjp.proceed();执行后才能执行环绕通知

<aop:config>

<!-- 定义一个可以被多个切面共享的切入点 -->

<aop:pointcut id="p1" expression="execution( void *Phone(int))"/>

<!-- 定义一个切面 ,指向实例化的切面类bean的id-->

<aop:aspect id="logAspect" ref="logAspectBean">

<!-- 切面业务的方法名 ,要指向切入点--> 
<aop:before method="before" pointcut-ref="p1"/>

<!-- 最终通知:目标业务发生异常,不影响最终通知业务执行 -->
<aop:after method="afterReturning" pointcut-ref="p1"/>

<!-- 后置通知:目标业务发生异常,后置业务不再执行 -->
<aop:after-returning method="log" pointcut-ref="p1"/>

<!-- 环绕通知:拦截目标方法的调用 -->
<aop:around method="around" pointcut-ref="p1"/>

<!-- 异常通知 -->
<aop:after-throwing method="exceptionThrowing" pointcut-ref="p1" throwing="e"/>

</aop:aspect>

</aop:config>

Spring注解式通知

<!-- 启用注解配置 -->

<aop:aspectj-autoproxy />

<!-- 目标业务对象 -->

<bean id="phoneBiz" class="s3spring.ch2.biz.impl.PhoneBizImpl"></bean>

<!-- 日志管理切面 -->

<bean class="s3spring.ch2.log.annotation.LogAspect"></bean>

@Aspect注解声明为切面

@Aspect

public class LogAspect {……}

为切面添加注解

@Before("execution( void *Phone(int))")

@AfterReturning("execution( void *Phone(int))")

@After("execution( void *Phone(int))")

@Around("execution( void *Phone(int))")

@AfterThrowing注解配置异常通知除了需要指定切入点外还需要根据方法参数名称绑定异常对象

@AfterThrowing(pointcut="execution( void *Phone(int))",throwing="e")

Spring框架学习之SpringAOP(二)的更多相关文章

  1. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  2. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  3. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  4. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  5. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  6. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  7. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  8. spring 框架学习网站

    spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference

  9. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

随机推荐

  1. ES 2016+

    ES2016(ES7)新增: Array.prototype.includes Exponentiation Operator 求冥运算 ES2017 (ES8)新增: ECMAScript® 201 ...

  2. Android应用资源

    Java刚開始学习的人直接在Java源代码使用"hello" 和123 类型的字符串和整型.但时间长了就会忘记当初定义的原因,有经验的或许会定义字符串常量ResultSet.TYP ...

  3. EF TMD

    TMD 几个月前,本着学习的心态,首次在项目中应用EF.因为这里老是赶.赶.赶,当时只是匆匆而就,浅尝辄止,搞到现在对EF一知半解,每次在新项目使用,都担惊受怕,大费周折,不知道什么时候,在什么地方就 ...

  4. 第一章、Tiny4412 U-BOOT移植一 说明【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37520291 一.移植前说明: 1.  特别声明:此文档是我的学习文档,里面肯定有错误地方,仅供 ...

  5. 【Poj3241】Object Clustering

    Position: http://poj.org/problem?id=3241 List Poj3241 Object Clustering List Description Knowledge S ...

  6. 懒人学习automake, Makefile.am,configure.ac

    已经存在Makefile.am,如何生成Makefile? 步骤: [root@localhost hello]# autoscan .///在当前文件夹中搜索 [root@localhost hel ...

  7. FSDataInputStream对象 读取数据

  8. 【RAID在数据库存储上的应用 】

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  9. 谈谈windows下克隆的坑

    本来在mac里一个项目里新建了一个I/O的文件夹. 当时就直接被系统自动改成了I:O.   本来也没多在意,感觉也不是什么大事. 这是push到GitHub上的样子. 当时没多想,感觉没什么问题,就是 ...

  10. codevs1993 草地排水(最大流)

    1993 草地排水 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在农夫约翰的农场上,每逢下雨,Bes ...