博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAop与AspectJ
阅读量:5217 次
发布时间:2019-06-14

本文共 2675 字,大约阅读时间需要 8 分钟。

AspectJ

AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

spring aop

Spring提供了四种类型的Aop支持 

* 基于经典的SpringAOP 
* 纯POJO切面 
* @ASpectJ注解驱动的切面 
* 注入式AspectJ切面(其实与Spring并无多大的关系,这个就是使用AspectJ这个框架实现Aop编程)

基于经典的SpringAop

其使用ProxyFactoryBean创建: 

增强(通知)的类型有: 
前置通知:org.springframework.aop.MethodBeforeAdvice 
后置通知:org.springframework.aop.AfterReturningAdvice 
环绕通知:org.aopalliance.intercept.MethodInterceptor 
异常通知:org.springframework.aop.ThrowsAdvice

public interface IBookDao {    public int add() public int delete(); } public class BookDaoImpl implements IBookDao{ public int add() { System.out.println("正在添加图书..."); return 0; } public int delete() { System.out.println("正在删除图书..."); return 0; } } //实现了MethodInterceptor的环绕增强类 public class MyAdvice implements MethodInterceptor{ public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("Around Advice before method invocation"); Object o = invocation.proceed(); System.out.println("Around Advice after method invocation"); return o; } }

 

//将每一个连接点都当做切点(拦截每一个方法)

 

使用RegexMethodPointcutAdvisor针对某些特定的方法进行拦截增强

 

注意

像上面这样,每定义一个dao都需要定义一个ProxyFactoryBean,显得很麻烦,所以我们引入自动代理,也就是自动创建代理对象

BeanNameAutoProxyCreator

 

DefaultAdvisorAutoProxyCreator

 

纯POJO切面,需要使用XML进行配置

public interface IBookDao {    public int add(); public int delete(); } public class BookDaoImpl implements IBookDao{ public int add() { int a = 1/0; System.out.println("正在添加图书..."); return 0; } public int delete() { System.out.println("正在删除图书..."); return 0; } }

 

public class PojoAdvice {    public void before(){ System.out.println("前置通知"); } public void after(Object returnval){ System.out.println("后置通知"+",处理后的结果为:"+returnval); } public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("环绕前置增强..."); Object o = proceedingJoinPoint.proceed(); System.out.println("环绕后置增强..."); return o; } public void afterThrowing(Throwable e){ System.out.println("异常通知:"+e.getMessage()); } }

 

 

联系

我们借助于Spring Aop的命名空间可以将纯POJO转换为切面,实际上这些POJO只是提供了满足切点的条件时所需要调用的方法,但是,这种技术需要XML进行配置,不能支持注解 

所以spring借鉴了AspectJ的切面,以提供注解驱动的AOP,本质上它依然是Spring基于代理的AOP,只是编程模型与AspectJ完全一致,这种风格的好处就是不需要使用XML进行配置

本文为学习而转载 https://blog.csdn.net/qq_21050291/article/details/72523138

转载于:https://www.cnblogs.com/danica/p/9406094.html

你可能感兴趣的文章
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
CoreData 从入门到精通(四)并发操作
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>
Java编程思想总结笔记Chapter 5
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
WinForm聊天室
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
selenium学习中遇到的问题
查看>>