Srping 全注解开发 ---AOP 模块,教科书般的排查与分析过程
AOP 模块
[](
)回顾五个通知注解
=======================================================================
[](
)使用演示
===================================================================
[](
)1.切面类(@Aspect)
@Aspect//表明是一个切面类
public class MyAspect
{
//抽取公共的切入点表达式
//1.本类引用:直接写方法名()
//2.其他切面引用:方法的全类名()
@Pointcut("execution(public int com.math.calculator.*(..))")
public void point(){};
//在目标方法之前切入,切入点表达式(指定切入哪个方法)
//本类方法引用切点表达式演示:
@Before("point()")
public void logStart()
{
System.out.println("目标方法运行前...");
}
//外部方法引用切点表达式演示:
@After("com.aop.MyAspect.point()")
public void logAfter()
{
System.out.println("目标方法结束后...");
}
@AfterReturning("point()")
public void logReturning()
{
System.out.println("目标方法正常返回后...");
}
@AfterThrowing("point()")
public void logThrowing()
{
System.out.println("目标方法出现异常后...");
}
}
[](
)业务逻辑类
//计算器类
public class calculator
{
public int add(int i,int j)
{
return i+j;
}
}
[](
)在配置类中将切面类和业务逻辑类都加入到容器中
[](
)切记给配置类上加上 @EnableAspectJAutoProxy,开启基于注解的 aop 模式
@EnableAspectJAutoProxy
@Configuration
public class MyConfig
{
@Bean
public MyAspect myAspect()
{
return new MyAspect();
}
@Bean
public calculator calculator()
{
return new calculator();
}
}
[](
)测试
public class Main
{
//传入的是配置类的位置,一开始是加载配置类,之前是加载配置文件的位置
private static AnnotationConfigApplicationContext ioc= new AnnotationConfigApplicationContext(MyConfig.class);
public static void main(String[] args)
{
calculator bean = ioc.getBean(calculator.class);
System.out.println(bean.add(1,2));
}
}
[](
)注意:spring 中很多 Enablexxx 都是开启某一项功能
[](
)在切面类的方法中获取切入方法的相关信息
[](
)joinpoint 必须出现在方法参数的首位
@Aspect//表明是一个切面类
public class MyAspect
{
//抽取公共的切入点表达式
//1.本类引用:直接写方法名()
//2.其他切面引用:方法的全类名()
@Pointcut("execution(public int com.math.calculator.*(..))")
public void point(){};
//在目标方法之前切入,切入点表达式(指定切入哪个方法)
//本类方法引用切点表达式演示:
@Before("point()")
public void logStart(JoinPoint joinPoint)
{
System.out.println("目标方法运行前 "+"方法名:"+joinPoint.getSignature().getName());
}
//外部方法引用切点表达式演示:
@After("com.aop.MyAspect.point()")
public void logAfter()
{
System.out.println("目标方法结束后...");
}
//joinpoint 必须出现在方法参数的首位
@AfterReturning(value = "point()",returning = "res")
public void logReturning(JoinPoint js,Object res)
{
System.out.println(js.getSignature().getName()+"方法正常返回后 "+"方法返回值:"+res);
}
//joinpoint 必须出现在方法参数的首位
@AfterThrowing(value = "point()",throwing = "ex")
public void logThrowing(JoinPoint js,Exception ex)
{
System.out.println(js.getSignature().getName()+"方法出现异常后 "+"异常是:"+ex);
}
}
评论