Spring-aop面向切面编程

注意:通过接口实现可以用Method method, Object[] args, Object target, Exception ex 获取相关信息。

通过schema和注解,可以通过joinPoint\Object returnValue\throws e

   

   

   

   

   

相关jar包:

1、aopliance.jar

2、aspectjweaver.jar

   

   

  • <!-- aop -->
  • <!-- 配置切入点 -->
  • <bean id="clazzDao" class="cn.tri.dao.impl.ClazzDaoImpl"></bean>
  • <!-- 配置前置通知 -->
  • <bean id="aopBefor" class="cn.tri.aop.AopBefor"></bean>
  • <!-- 关联前置通知和切入点 -->
  • <aop:config>
  •     <aop:pointcut expression="execution(public void cn.tri.dao.impl.ClazzDaoImpl.showClazz(java.lang.String))" id="testAopBefor"/>
  •     <aop:advisor advice-ref="aopBefor" pointcut-ref="testAopBefor"/>
  • </aop:config>

   

异常通知,有些许不一样,必须实现ThrowAdvice接口,写afterThrowing方法。 无异常不触发

   

   

   

  1. public class AopException implements ThrowsAdvice{
  2.     public void afterThrowing(Method method, Object[] args, Object target, Exception ex){
  3.         System.out.println("---异常通知");
  4.         System.out.println(method+"---"+args.length+"---"+target+"---"+ex);
  5.     }
  6. }

   

   

   

<aop:ponitcut expressssion="全类名+方法+参数" id="随意1">

<aop:advisor advice-ref="通知类id" pointcut-ref="随意1"

   

此2句将切入点和通知绑定,

多个showclazzX 需要X个 excution();

   

前置通知实现 MethodBeforeAdvice

后置通知实现 AfterReturningAdvice

假设a、b、c都有共同方法showClazz();

前置通知AopBefor impelement MethodBeforAdvice

注解Aop

   

  1. <!--扫描带有componte\controller\service\Respository-->
  2. <context:component-scan base-package="cn.tri.aop"></context:component-scan>
  3. <!--扫描@aspectj 注解-->
  4. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

   

   

   

  • @Component("AopAnnotation")//同<bean id="AopAnnotation" class="此类">   加入IOC容器
  • @Aspect//申明此类为通知类
  • public class AopAnnotation {
  •     
  •     @Before("execution(public * getName())")
  •     public void AnnotationBefor(JoinPoint jp){
  •         System.out.println("方法数:"+jp.getSignature().getModifiers()+"/n"+
  •                            "方法名:"+jp.getSignature().getName()+"/n"+
  •                            "方法所在类:"+jp.getSignature().getDeclaringType()+"/n"
  •                 );
  •         System.out.println("前置通知");
  •     //System.out.println(returnValue+"---"+method+"---"+args.length+"---"+target);
  •  }

       

  •     @After("execution(public * getName())")
  •     public void AnnotationAfter(){
  •         System.out.println("后置通知");
  •     }

       

  •     @AfterThrowing(value="execution(public * getName())",Exception e)//此处只会捕获申明异常
  • public void AnnotationThrowing(){
  •         System.out.println("异常通知");
  •     }

       

  •     @AfterReturning(value="execution(public * getName())",returning="result")
  •         public void AnnotationReturning(JoinPoint jp,Object result){
  •         System.out.println("后置通知");
  •     }

       

  •     @Around(value="execution(public * getName())")
  •         public void AnnotationAround(ProceedingJoinPoint pjp){
  •             try {
  •                 //前置
  •  pjp.proceed();//执行切面
  • //后置
  • } catch (Throwable e) {
  •                 System.out.println("异常");
  •                 e.printStackTrace();
  •             }
  •             System.out.println("环绕通知");
  •         }
  •     
  • }

   

   

   

schema配置

   

  • <!-- 配置schema 通知 -->
  • <bean id="testSchema" class="cn.tri.dao.impl.SchemaClazz">
  • </bean>
  • <bean id="aopSchema" class="cn.tri.aop.AopSchema"></bean>
  • <aop:config>
  •     <!-- 配置切入点 -->
  •     <aop:pointcut expression="execution(public void cn.tri.dao.impl.SchemaClazz.testSchema())" id="schemaAop"/>
  •     <aop:aspect ref="aopSchema">
  •         <aop:before method="beforSchema" pointcut-ref="schemaAop"/>
  •         <aop:after method="afterSchema" pointcut-ref="schemaAop"/>
  •         <aop:after-returning method="retrunSchema" returning="retrunValue" pointcut-ref="schemaAop"/>
  •         <!-- 连接线 -->
  •     </aop:aspect>
  • </aop:config>

   

   

  1. public class SchemaClazz {
  2.     public void testSchema(){
  3.         System.out.println("Schema切入点");
  4.     }
  5. }

   

   

posted @ 2020-10-18 20:22  黑质白章  阅读(106)  评论(0编辑  收藏  举报