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. Linux下的应用程序开机自启动

    Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...

  2. CI框架下CSS和JS的路径问题

    注意:CI框架下的CSS和JS的引用必须放在框架外面,比如,可建立resource文件夹与application同级,用来封装CSS和JS. 在view层用resource里面CSS和JS可采用以下几 ...

  3. Android 完全退出应用程序

    随着业务逻辑越来越复杂,退出应用程序也不像之前那个直接将Activity finish()掉就可以了,在网上看到很多完全退出App的文章,但是实践之后发现,并不像文章中描述的那样,不是方法过时了,就是 ...

  4. E: Unable to lock the administration directory (/var/lib/dpkg/)

    如何修复 Ubuntu 中的“Unable to lock the administration directory (/var/lib/dpkg/)” 在 Ubuntu 或者它的衍生版如 Linux ...

  5. go语言笔记——map map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序

    示例 8.1 make_maps.go package main import "fmt" func main() { var mapLit map[string]int //va ...

  6. jsp ajax 数据库Demo

    转自:http://blog.csdn.net/rushkid02/article/details/7515058 下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验(校验方式 ...

  7. 面向对象软件工程与UML

    软件工程基本概念 软件危机 软件的功能.规模及复杂性与日俱增,软件的复杂性达到了它的开发者难以控制的程度 这种情况导致了严重的后果: 软件可靠性下降 开发效率低下 维护极为困难 这使软件开发者陷入困境 ...

  8. CentOS Linux VPS桌面环境一键安装包

  9. Reward(toposort)

    http://acm.hdu.edu.cn/showproblem.php?pid=2647 #include <stdio.h> #include <string.h> #i ...

  10. ckeditor使用时,第一次可以显示,修改后显示不了的问题

    1.谷歌浏览器会留有缓存,除去缓存后,就可以更改ckeditor了.下面是解决方法: