博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP 详解
阅读量:4161 次
发布时间:2019-05-26

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

AOP核心概念

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)

简单来说,就是所有可以增强的方法(例子中的save,update,delect,find方法都是连接点)

4、切入点(pointcut)

众多连接点中真正需要增强的方法(要切入的点)(比如我只对save方法进行增强,那么四个方法中save方法就是切入点)

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类(其实就是对方法做的事情,比如对切入点添加的事务管理,日志,等)(例子中的Advice里面的方法)

6、目标对象

代理的目标对象(对哪个对象进行增强,那么这个对象就是目标对象.例子中的UserServiceImpl)

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程(将通知应用到切入点的过程,将advice里的方法加到userService里面的save等方法的过程)

8、代理()Proxy)

将通知织入到目标对象之后,形成代理对象

Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:

1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了

2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:

1、定义普通业务组件

2、定义切入点,一个切入点可能横切多个业务组件,即准备目标对象(需要增强的对象)

3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作(准备通知,增强的方法,比如事务,日志啥的),这个动作就是将通知织入到目标对象的过程

所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。

下面给出一个Spring AOP的.xml文件模板,名字叫做applicationContext.xml,之后的内容都在applicationContext.xml上进行扩展:

 
新建一个目标对象

@Override	public void save() {		System.out.println("保存用户!");		//int i = 1/0;	}	@Override	public void delete() {		System.out.println("删除用户!");	}	@Override	public void update() {		System.out.println("更新用户!");	}	@Override	public void find() {		System.out.println("查找用户!");	}}

新建一个通知类(增强的东西,比如事务,日志啥)

//通知类public class MyAdvice {		//前置通知	//		|-目标方法运行之前调用	//后置通知(如果出现异常不会调用)//		|-在目标方法运行之后调用	//环绕通知//		|-在目标方法之前和之后都调用	//异常拦截通知//		|-如果出现异常,就会调用	//后置通知(无论是否出现 异常都会调用)//		|-在目标方法运行之后调用//----------------------------------------------------------------	//前置通知	public void before(){		System.out.println("这是前置通知!!");	}	//后置通知	public void afterReturning(){		System.out.println("这是后置通知(如果出现异常不会调用)!!");	}	//环绕通知	public Object around(ProceedingJoinPoint pjp) throws Throwable {		System.out.println("这是环绕通知之前的部分!!");		Object proceed = pjp.proceed();//调用目标方法		System.out.println("这是环绕通知之后的部分!!");		return proceed;	}	//异常通知	public void afterException(){		System.out.println("出事啦!出现异常了!!");	}	//后置通知	public void after(){		System.out.println("这是后置通知(出现异常也会调用)!!");	}}

将通知织入到切入点(将通知增强到目标方法,形成一个新的目标代理对象)

测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:cn/itcast/d_springaop/applicationContext.xml")public class Demo {	@Resource(name="userService")	private UserService us;		@Test	public void fun1(){		us.save();	}	}
结果

这是前置通知!!这是环绕通知之前的部分!!这是环绕通知之后的部分!!这是后置通知(如果出现异常不会调用)!!这是后置通知(出现异常也会调用)!

========================================================================

上面的是xml的配置方式 还有一种注解的配置方法,区别在于 xml中引入注解扫描,然后在通知类(增强的方法)上使用注解

 xml引入注解扫描

 通知类使用注解配置AOP

//通知类@Aspect//表示该类是一个通知类public class MyAdvice {	@Pointcut("execution(* cn.itcast.service.*ServiceImpl.*(..))")	public void pc(){}	//前置通知	//指定该方法是前置通知,并制定切入点	@Before("MyAdvice.pc()")	public void before(){		System.out.println("这是前置通知!!");	}	//后置通知	@AfterReturning("execution(* cn.itcast.service.*ServiceImpl.*(..))")	public void afterReturning(){		System.out.println("这是后置通知(如果出现异常不会调用)!!");	}	//环绕通知	@Around("execution(* cn.itcast.service.*ServiceImpl.*(..))")	public Object around(ProceedingJoinPoint pjp) throws Throwable {		System.out.println("这是环绕通知之前的部分!!");		Object proceed = pjp.proceed();//调用目标方法		System.out.println("这是环绕通知之后的部分!!");		return proceed;	}	//异常通知	@AfterThrowing("execution(* cn.itcast.service.*ServiceImpl.*(..))")	public void afterException(){		System.out.println("出事啦!出现异常了!!");	}	//后置通知	@After("execution(* cn.itcast.service.*ServiceImpl.*(..))")	public void after(){		System.out.println("这是后置通知(出现异常也会调用)!!");	}}

转载地址:http://xfjxi.baihongyu.com/

你可能感兴趣的文章
LDD3源码分析之llseek分析(二)
查看>>
printk及控制台的日志级别
查看>>
Linux驱动加载实例
查看>>
详解数据库设计中的三大范式理论
查看>>
JDBCUtils工具类
查看>>
Linux基本命令(1)
查看>>
Linux基本命令(二)
查看>>
Hive2.0函数大全(中文版)
查看>>
hive里面的连接操作(join)
查看>>
卸载oracle
查看>>
hive 自定义函数jar发布的方法
查看>>
对DMA传输机制的学习
查看>>
QT中this指针
查看>>
java中的异常机制
查看>>
java SE面向对象思维导图
查看>>
数据结构常见排序
查看>>
人工智能GIS技术升级,将应用到更多领域
查看>>
厕所地图,玩出新花样!
查看>>
时空大数据技术驱动城市交通智能化,重庆这样做
查看>>
springboot中配置supermap objects java组件
查看>>