zoukankan      html  css  js  c++  java
  • Spring4——基于注解形式的aop实现、基于Schema形式的aop实现

    基于注解形式的aop实现
    1.jar
    与实现接口方式的一致。
    2.配置
    将业务类、通知类纳入IOC容器。
    开启注解对AOP的支持。
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    

    使用@Componet注解需要扫描器。

    <context:component-scan base-package="org.ghl.aop"/>
    
    3.编写
    通知类
    //给予注解实现aop
    //加此注解后此类是通知
    @Aspect
    public class LogAspectAnnotation {
        //添加注解使得方法变成前置通知方法
        @Before("execution(public * addStudent(..))") //属性:定义切点
        public void logBeforeAnno(){
            System.out.println("注解形式【前置通知】...");
        }
    
    
        //注解实现后置通知
        @AfterReturning("execution(public * addStudent(..))") //属性:定义切点
        public void logAfterAnno(){
            System.out.println("注解形式【后置通知】...");
        }
    }
    

    注意:扫描器会将指定包中的@Componet, @Service, @Respository, @Controller   修饰的类产生的对象添加到xml中。

     
    *通过注解形式实现的aop,获取目标对象的信息,要通过对象JoinPoint。
    注解形式返回值问题:
    声明返回值的参数名。
    //注解实现后置通知
    @AfterReturning(pointcut = "execution(public * org.ghl.service.impl.StudentServiceImpl.addStudent(..))",returning = "returningValue") //属性:定义切点
    public void logAfterAnno(JoinPoint jp,Object returningValue){
        System.out.println("注解形式【后置通知】...:目标对象:"+jp.getTarget()+",方法名:"+jp.getSignature().getName()+",参数列表:"+ Arrays.toString(jp.getArgs())+",返回值:"+returningValue);
    }
    

    *若报错:IllegalArgumentException: 参数异常。  

    *注解形式异常通知,若想捕获指定的异常,则用第二个参数e 

    //异常通知,若想捕获指定的异常,则用第二个参数
    @AfterThrowing(value = "execution(public *  org.ghl.service.impl.StudentServiceImpl.addStudent(..))",throwing = "e")
    public void logExceptionAnno(JoinPoint jp,NullPointerException e){
        System.out.println("《注解形式【异常通知】》:e:"+e.getMessage());
    }
    

     

    基于Schema形式的aop实现(通过配置实现aop)
    (1)编写一个普通类;
    (2)将该类通过配置变成一个“通知”。
    <!--基于Schema形式的aop实现-->
    <bean id="logSchema" class="org.ghl.aop.LogSchema">
    </bean>
    
    
    <aop:config>
        <!--配置切入点(在哪里执行通知)-->
        <!--=====连接线的另一方======-->
        <aop:pointcut expression="execution(public * org.ghl.service.impl.StudentServiceImpl.addStudent(org.ghl.entity.Student))" id="pcSchema"></aop:pointcut>
        <!--advisor相当于连接切入点和切面的线-->
        <!--=======连接线=======-->
      <!--  <aop:advisor advice-ref="logSchema" pointcut-ref="pcSchema"/>-->
        <!--Schema形式-->
        <aop:aspect ref="logSchema">
            <!--连接线-->
            <aop:before method="before" pointcut-ref="pcSchema"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pcSchema" returning="returnValue"/>
            <aop:after-throwing method="whenException" throwing="e" pointcut-ref="pcSchema"/>
            <aop:around method="around" pointcut-ref="pcSchema"/>
        </aop:aspect>
    </aop:config>
    
    获取目标对象时:
    注解、Schema形式:JoinPoint
    接口:Object returnValue, Method method, Object[] args, Object target
     
  • 相关阅读:
    Linux常用命令-学习笔记
    Linux 输入输出重定向
    Linux 网卡配置参数
    JS Promise对象学习
    Linux用户身份与文件权限学习笔记
    4、点击事件
    3、自定义按压效果
    2、自定义背景形状
    1、文字大小,颜色
    5、跑马灯
  • 原文地址:https://www.cnblogs.com/ghlz/p/13181928.html
Copyright © 2011-2022 走看看