1、spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解
1.1 引入 xmlns:context
2、建立demo类 、通知类
public class Demo {
public void demo01() throws Exception {
//int i=5/0;
System.out.println("demo01");
}
}
//通知类
public class MyAdivce {
public void mybefore() {
System.out.println("前置mybefore1");
}
public void myafter() {
System.out.println("后置通知");
}
public void myThrow() {
System.out.println("异常通知");
}
public Object myarround(ProceedingJoinPoint p) throws Throwable {
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕-后置");
return result;
}
}
3、实现步骤
3.1 在 spring 配置文件中设置注解在哪些包中
<context:component-scan base-package=“com.oyzk.advice,com.oyzk.test”></context:component-scan>
3.2 在 Demo 类中添加@Componet
3.2.1 在方法上添加@Pointcut(“”) 定义切点
@Component
public class Demo {
@Pointcut("execution(* com.oyzk.test.Demo.demo01())")
public void demo01() throws Exception {
//int i=5/0;
System.out.println("demo01");
}
}
3.3 在通知类中配置
3.3.1 @Component 类被 spring 管理
3.3.2 @Aspect 相当于aop:aspect/表示通知方法在当前类中
@Component
@Aspect
//@Aspect相当于<aop:aspect/>表示在通知方法在当前类中 @Component类被spring管理
//注解适合指定的某个切点的配,不适合大面积的
public class MyAdivce {
@Before("com.oyzk.test.Demo.demo01()")
public void mybefore() {
System.out.println("前置mybefore1");
}
@After("com.oyzk.test.Demo.demo01()")
public void myafter() {
System.out.println("后置通知");
/**
* @After和@AfterThrowing区别:前者怎么都执行,后者正常执行
*/
}
@AfterThrowing("com.oyzk.test.Demo.demo01()")
public void myThrow() {
System.out.println("异常通知");
}
@Around("com.oyzk.test.Demo.demo01()")
public Object myarround(ProceedingJoinPoint p) throws Throwable {
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕-后置");
return result;
}
}
3.4结果:
拦截异常的: