AOP案例
即动态代理,在程序运行期间动态的将某段代码切入到指定方法指定位置进行编程的方式。
1.导入AOP依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.0</version>
</dependency>
2.新建业务类
package bean;
import org.springframework.stereotype.Component;
public class DoWork {
public int work(int i,int j){
System.out.println("**工作中****::"+i/j);
return i/j;
}
}
3.新建切面类及添加通知注解、切面注解
package aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
// @Aspect注解标识当前类为切面类
@Aspect
@Component
public class LogAspect {
// 切入点
@Pointcut("execution(int bean.DoWork.work(..))")
public void pointCut(){
}
// 前置通知:执行目标方法之前执行
@Before("pointCut()")
public void before(JoinPoint point){
Object[] args = point.getArgs();
System.out.println("aspect....before....方法名:"+point.getSignature().getName());
System.out.println("参数:"+Arrays.asList(args));
}
// 后置通知:执行完目标方法后执行
@After("pointCut()")
public void after(JoinPoint point){
System.out.println("aspect....after....方法名:"+point.getSignature().getName());
}
// 返回通知:执行完目标方法后正常返回后执行
@AfterReturning(value = "pointCut()",returning = "result")
public void afterReturn(JoinPoint point,Object result){
Object[] args = point.getArgs();
System.out.println("参数:"+Arrays.asList(args));
System.out.println("aspect....afterReturn....参数返回值:"+result);
}
// 异常通知:执行完目标方法后异常返回后执行
@AfterThrowing(value = "pointCut()",throwing = "ex")
public void afterException(JoinPoint point,Exception ex){
System.out.println("aspect....afterException....方法名:"+point.getSignature().getName()+"返回值:"+ex);
}
}
1.切面类要添加@Aspect注解来标识此类为切面类
2.各通知中的参数JoinPoint必须要作为第一个参数传入(多参数情况,如上
afterReturn
方法)
3.新建配置类
package config;
import aop.LogAspect;
import bean.DoWork;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@ComponentScan(value = {"bean","aop"})
@Configuration
public class ConfigOfAOP {
}
一定要添加@EnableAspectJAutoProxy来开启切面自动代理
@ComponentScan 扫描的bean包 包含业务类;aop包 包含切面类
4.测试类
@Test
void testAOP() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfigOfAOP.class);
/** 注意:这里业务对象一定要从容器中获取*/
DoWork doWork = (DoWork) applicationContext.getBean("doWork");
doWork.work(6,2);
}