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. SpringBoot在Impl类中调用其它service层失败解决办法

    在AImpl.java文件中引用BImpl.java的方法,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controller层通过@Autowire ...

  2. spring web中的filter

    昨天看了会spring web中部分代码,主要是各种filter,回顾一下: Spring的web包中中有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所 ...

  3. ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢?

    ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢? 很多文章中都有说道:当时ngRoute在路由配置时用$r ...

  4. 如何使js函数异步执行

    CallbacksCallbacks使用场景在哪里?在很多时候需要控制一系列的函数顺序执行.那么一般就需要一个队列函数来处理这个问题: function Aaron(List, callback) { ...

  5. Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆

    题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制 ...

  6. [Swift通天遁地]四、网络和线程-(9)上传图片并实时显示上传进度

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. selenium3 + python - action_chains源码分析

    ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互.这对于做更复杂的动作非常有用,比如悬停和 ...

  8. BZOJ 4668 LCT

    思路: 这不是LCT裸题嘛23333 (好像并查集+按秩合并就可以搞了 我还是too young) 维护边权的话 就新加一个点 代表边 这个点想线段的两个端点连边就好了 //By SiriusRen ...

  9. hdu2027

    http://acm.hdu.edu.cn/showproblem.php?pid=2027 #include<iostream> #include<stdio.h> #inc ...

  10. Java系列学习(十)-包与权限修饰符

    1.形式参数和返回值的问题 (1)形式参数: A:类名:需要该类的对象 B:抽象类名:需要改类的子类对象 C:接口名:需要该接口的实现对象 (2)返回值类型: A:类名:抽象类名:返回的是该类的对象 ...