zoukankan      html  css  js  c++  java
  • sping中AOP

    spring AOP的主要作用:https://blog.csdn.net/baidu_33403616/article/details/70304051

    一般是直接定义个类,作为切面!

    委托代理的概念:

    委托类对象就是我们后面说到的"目标对象", 也就是需要【被】代理的对象 target
    代理类对象就是我们后面说到的"代理对象",目标对象就是需要这个对象为其做为代理 proxy

      按照代理类的创建时期,代理类可分为两种。
            静态代理类:
                在程序运行前,代理类的.class文件就已经存在了
            动态代理类:

        JDK动态代理要求目标类实现接口,才能对其进行代理
           对于没有实现接口的类,可以使用CGLib进行动态代理
                在程序运行时,代理类是运用了反射技术或字节码技术动态创建而成的

    AOP的概念:

        AOP          面向切面编程

        aspect        切面/切面类(要切入的内容)

        joinPoint    连接点
                在spring的aop中只有 类中的方法 可以做连接点,每一个方法都可以是一个连接点.
            
        pointCut    切入点
                一组连接点的集合

        advice        通知/拦截器 (控制织入地点)
                用来控制切面类将来到底是织入到切入点的前面、后面或者是抛异常的时候。

        adivsor        增强器
                用来筛选类中的哪些方法是我们的连接点(哪些方法需要被拦截).

        target        目标对象

        proxy        代理对象

        wave        织入

    advice(通知)的类型:

            前置通知(Before advice):
                在某些连接点(方法,是接口中的方法)(join point)之前执行的通知

            返回后通知(After returning advice):
                在某些连接点(join point)正常完成后执行的通知(方法正常结束,没有异常)

            抛出异常后通知(After throwing advice):
                在某些连接点(join point)抛出异常退出时执行的通知

            后通知(After (finally) advice):
                当某些连接点(join point)退出的时候执行的通知

            环绕通知(Around Advice):
                包围一个连接点(join point)的通知,例如事务的处理,就需要这样的通知,因为事务需要在方法前开启,在方法后提交,以及方法抛出异常时候回滚

    注:在spring中,连接点(join point)指的就是方法

    1,aop:config标签(':' 前面的是命名空间,区分标签的,避免命名冲突)

    使用aop的专用标签来完成相关的配置.
    其中主要表现是使用expression的操作:

    expression = "execution(public * com.briup.aop.service.*.*(..))"

    引号里面就是用表达式的方式来定义切入点,只要是符合这个表达式要求的,该方法就是连接点,连接点的集合就是我们要定义的切入点

    从左至右:第一个*:方法的返回类型不限

         第二个*:表示包中任意一个类

        第三个*:类中任意一个返回类型的方法

        (..) 匹配了一个接受任意数量参数的方法

        (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型

        () 匹配了一个不接受任何参数的方法

    2,使用注解配置AOP,就可以去掉xml中的aop标签配置

     @Component
        @Aspect
        public class AnnotationHandler {
            /*
             * 在一个方法上面加上注解来定义切入点
             * 这个切入点的名字就是这个方法的名字
             * 这个方法本身不需要有什么作用
             * 这个方法的意义就是:给这个 @Pointcut注解一个可以书写的地方
             * 因为注解只能写在方法、属性、类的上面,并且方法名作为切入点的名字
             * */
            @Pointcut("execution(public * com.briup.aop.service..*.*(..))")
            public void myPointCut(){}

      //切入点方法执行前调用

      @Before("myPointCut()")
            public void beforeTest(JoinPoint p){
                System.out.println(p.getSignature().getName()+" before...");
            }

      //切入点方法执行期间抛出异常的时候,会调用这个

      @AfterThrowing(value="myPointCut()",throwing="ex")
            public void throwingTest(JoinPoint p,Exception ex){
                System.out.println(p.getSignature().getName()+" is throwing..."+ex.getMessage());
                
            }
            
        }

      xml配置:
        <aop:aspectj-autoproxy/>
        <context:component-scan base-package="com.briup.aop"/>

    注意:<aop:aspectj-autoproxy proxy-target-class="true"/>这样配置则是强制使用CGLIB进行代理

  • 相关阅读:
    【css】容器撑满浏览器--- height:100%
    【实践】js六道有趣的题
    【Canvas】树冠
    asp.net上传Excel文件到服务端进行读取
    HttpContext.Current多线程调用
    abstract修饰符,具体类与抽象类的区别
    如何快速恢复MyEclipse的默认主题
    日历源代码
    for语句应用:乘法表
    Java的优先级
  • 原文地址:https://www.cnblogs.com/wskb/p/10939434.html
Copyright © 2011-2022 走看看