AOP:指在程序运行期间,将某段业务diam切入到指定方法、指定位置进行运行的编程方式
1、导入AOP POM依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
保证我们依赖中有aspects和aspectjwearver包
2、定义业务逻辑类
需求是在业务逻辑运行(之前、结束、异常,返回结果)等位置,记录业务方法的相关日志 。
3、定义日志切面类
通知类型:前置通知、后置通知、返回通知、异常通知、环绕通知
前置通知(@Before):在目标方法运行之前运行。
后置通知(@After):在目标方法运行之后运行,无论方法正常结束,还是异常结束抽取公共的切入点表达式。
返回通知(@AfterReturning):在目标方法正常返回之后运行。如果异常调用异常通知。
异常通知(@AfterThrowing):在目标防范抛出异常运行。
环绕通知(@Around):动态代理,手动控制目标方法执行(JointPoint.proceed)
给切面类的目标方法标注何时何地运行。
//JoinPoint一定要出现在参数表的第一位
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
}
@After("com.atguigu.aop.LogAspects.pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
}
//JoinPoint一定要出现在参数表的第一位
@AfterReturning(value="pointCut()",returning="result")
public void logReturn(JoinPoint joinPoint,Object result){
System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
}
@AfterThrowing(value="pointCut()",throwing="exception")
public void logException(JoinPoint joinPoint,Exception exception){
System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
}
4、抽取公共的切入点表达式
@Pointcut("execution(public int com.jetsen.aop.MathCalculator.*(..))")
public void pointCut(){};
5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
//业务逻辑类加入容器中
@Bean
public MathCalculator calculator(){
return new MathCalculator();
}
//切面类加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
6、Spring哪个类是切面类(给切面类上加一个注解:@Aspect)

7、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
8、本节总结
1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)
2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
3)、开启基于注解的aop模式;@EnableAspectJAutoProxy