AOP. 配置类
package com.example.paymentdemo.config;
import com.example.paymentdemo.aop.LogAspects;
import com.example.paymentdemo.main.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* @author xushuai
* @date 2022年03月22日 20:02
*/
/**
*
* @author xushuai
* @date 2022/3/22 20:03
* @param
* @return null
* AOP 在程序运行期间动态的将某些代码切入到指定位置进行运行的编程方式
* 1。导入AOP;Spring AOP spring-aspects
*
* 2。定义一个业务逻辑类
* 业务逻辑运行的时候打印日志(在方法之前,运行之后,异常时)
*
* 3。定义一个日志切面类 切面里的类方法需要动态感知所需方法运行到哪一步
* 通知方法:前置@Before,方法运行前运行
* 后置 @After:方法运行结束后运行 无论正常结束还是异常结束
* 返回@AfterReturning,在目标方法正常返回之后运行
* 异常通知@AfterThrowing, 方法异常返回
*
* 环绕通知 @Around:动态代理,手动推进目标方法运行JoinPoint.procced
*
* 4。给切面类的目标方法标注何时何地的运行(通知注解)
*
* 5.将切面类和业务逻辑类(目标方法所在类都加入到容器中)
*
* 6.告诉SPring哪个是切面类(给切面类上加一个注解) @Aspect
*
* 7.给配置类中加@EnableAspectJAutoProxy[开启自动代理] 在spring中有很多xxxJAutoProxy
*
* joinPoint参数一定要出现在参数第一位
*/
@Configuration
@EnableAspectJAutoProxy
public class MainConfigAop {
//业务逻辑类加入到容器里
@Bean
public MathCalculator mathCalculator(){
return new MathCalculator();
}
//切面类加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
属性类
package com.example.paymentdemo.main;
/**
* @author xushuai
* @date 2022年03月22日 20:09
*/
public class MathCalculator {
public int div(int i,int j){
return i/j;
}
}
切点,切面
package com.example.paymentdemo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
/**
* @author xushuai
* @date 2022年03月22日 20:14
*/
@Aspect
public class LogAspects {
//抽取公共的切入点表达式
//本类引用
//其他切面引用
@Pointcut("execution(public int com.example.paymentdemo.main.MathCalculator.*(..))")
public void pointCut(){
}
//目标方法切入 切入点表达式 指定在哪个方法
@Before("pointCut()")
public void logStart(){
System.out.println("开始运行=====");
}
@Around("pointCut()")
public void logAround(){
System.out.println("开始运行=====");
}
@After("pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println("运行结束=====");
}
@AfterReturning(value = ("pointCut()"),returning = "result")
public void logReturn(Object result){
System.out.println("运行结束返回=====");
}
@AfterThrowing(value = "pointCut()",throwing = "exception")
public void logException(Exception exception){
System.out.println("运行异常=====");
}
}
测试类
package com.example.paymentdemo.main;
import com.example.paymentdemo.config.MainConfigAop;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author xushuai
* @date 2022年03月22日 20:53
*/
public class AopTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigAop.class);
//不要自己New对象,要使用spring容器里的
//MathCalculator mathCalculator = new MathCalculator();
MathCalculator bean = applicationContext.getBean(MathCalculator.class);
int div = bean.div(1, 2);
System.out.println("=======");
}
}