注解方式
注解配置AOP,大致可以分为四步:
1.开发需要被拦截的类。
2.使用注解@Aspect来定义一个切面。
3.使用注解@Pointcut定义切入点表达式
4.在使用入口的类中开启注解方式。
示例:
需要被拦截的类
//接口
public interface Calc {
void say(String name);
int aa(int a,int b);
}
//实现接口的类
@Component
public class CalcLate implements Calc{
@Override
public void say(String name) {
System.out.println("你好啊!!!");
}
@Override
public int aa(int a, int b) {
//异常通知
int i=9/0;
return a+b;
}
}
切入点表达式
@Component
public class Pointcuta {
/*
通过@Pointcut注解定义切入点表达式
*/
@Pointcut("execution(* com.lanou3g.spring.zhujie..*.*(..))")
public void as(){}
}
切面类
@Aspect // 表示该类是一个切面
@Component // Aspect切面首先必须也是一个普通的bean
public class CalcAspect {
//环绕通知
@Around("com.lanou3g.spring.zhujie.Pointcuta.as()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("开始执行环绕通知");
Object ret=joinPoint.proceed();
System.out.println("执行结束环绕通知");
return ret;
}
//后置通知
@After("com.lanou3g.spring.zhujie.Pointcuta.as()")
public void af(){
System.out.println("后置通知");
}
//前置通知
@Before("com.lanou3g.spring.zhujie.Pointcuta.as()")
public void before(){
System.out.println("前置通知");
}
//返回通知
@AfterReturning("com.lanou3g.spring.zhujie.Pointcuta.as()")
public void returning(){
System.out.println("返回通知");
}
//异常通知
@AfterThrowing("com.lanou3g.spring.zhujie.Pointcuta.as()")
public void throwss(){
System.out.println("异常通知");
}
}
使用入口
@Configuration
@ComponentScan(basePackages = "com.lanou3g.spring.zhujie")
@EnableAspectJAutoProxy //开启注解方式的aop
public class AppZhuJie {
public static void main(String[] args) {
ApplicationContext a=new AnnotationConfigApplicationContext(AppZhuJie.class);
Calc calc=a.getBean(Calc.class);
calc.say("张三");
calc.aa(8,4);
}
}
主要使用的注解:
1.@Aspect 表示该类是一个切面
2.@Pointcut 定义切入点表达式
3.@Component 表示xml中bean
4.@Configuration 表示xml中的beans
5.@ComponentScan 扫秒路径
6.@EnableAspectJAutoProxy 开启注解方式aop
以及5个通知 @Around,@After,@Before,@AfterReturning,@AfterThrowing。
注解的方式使用起来比xml方式的方便一些,但是注解方式对代码有很大的侵入性,如果要修改代码会很麻烦。