一、Aop概念
在软件行业,AOP为Aspect Oriented Programming的缩写,意思是面向切面编程。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一种重要思想。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的重用性,同时提高开发的效率。
二、Spring中的AOP概念
1.spring能够为容器中管理的对象生成动态代理对象,能帮助我们生成动态代理对象
2.spring实现aop的原理
(1)动态代理(被代理的对象必须实现接口,这样才能创建代理对象)
(2)cglib代理(第三方代理技术,可以对任何类生成代理,代理的原理是对目标对象进行继承代理)
3.aop名词学习
(1)JoinPoint(连接点):在目标对象中,所有可以增强的方法
(2)PointCut(切入点):目标对象中已经增强的方法
(3)Advice(通知):增强的代码
(4)Target(目标对象):被代理的对象
(5)Weaving(织入):将通知应用到切入点的过程
(6)Proxy(代理):将通知织入到目标对象后,形成代理对象
(7)Aspect(切面):切入点+通知
4.使用AOP的步骤
(1)导包(spring-aspect、spring-aop、aopallience以及weaver包)
(2)准备目标对象
(3)准备通知
(4)配置进行织入目标对象中
三、通知分类
1.前置通知:目标方法运行之前调用
2.后置通知(出现异常不会调用):目标方法运行之后调用
3.环绕通知:目标方法运行前后都会调用
注意:环绕通知是最特殊的一种通知,需要在通知中自己调用目标方法
在环绕通知的方法参数中传递ProceedingJoinPoint类型的对象,然后在方法中使用此对象的proceed方法返回Object对象进行返回
四、使用注解来配置aop
1.使用方法
(1)首先需要在applicationContext.xml文件中开启注解配置,使用标签
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(2)然后在通知中进行如下配置:
package com.sgr.annotationaop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAdvice {
//前置通知
@Before("execution(* com.sgr.service.*Service.*(..))")
public void before() {
System.out.println("这是前置通知");
}
//后置通知
@AfterReturning("execution(* com.sgr.service.*Service.*(..))")
public void afterReturning() {
System.out.println("这是后置通知");
}
//环绕通知,最特别的一个通知,他需要控制目标方法的调用,因为需要在目标方法的调用之前和之后都需要调用
@Around("execution(* com.sgr.service.*Service.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("这是环绕通知之前的部分");
Object proceed = pjp.proceed();//调用目标方法
System.out.println("这是环绕通知之后的部分");
return proceed;
}
//异常通知
@AfterThrowing("execution(* com.sgr.service.*Service.*(..))")
public void afterException() {
System.out.println("出事情了");
}
//后置通知
@After("execution(* com.sgr.service.*Service.*(..))")
public void after() {
System.out.println("这是后置通知,出现异常也会调用");
}
}