zoukankan      html  css  js  c++  java
  • AOP学习心得&jdk动态代理与cglib比较

    什么是AOP

    AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

       

    AOP使用场景

    AOP用来封装横切关注点,具体可以在下面的场景中使用:

    Authentication 权限

    Caching 缓存

    Context passing 内容传递

    Error handling 错误处理

    Lazy loading 懒加载

    Debugging  调试

    logging, tracing, profiling and monitoring 记录跟踪 优化 校准

    Persistence  持久化。。。等

    jdk动态代理与cglib比较

       jdk的动态代理是基于类实现了接口,cglib是基于类,没有强制要求目标类一定要是实现接口。

       jdk的核心是实现InvocationHandler接口,使用invoke()方法进行面向切面的处理,调用相应的通知。

       cglib的核心是实现MethodInterceptor接口,使用intercept()方法进行面向切面的处理,调用相应的通知。

       其中cglib中有一个Enhancer类,可以使用他快速的创建一个代理类。

      例如:

    @Test
    public void testEnhancer() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(Print.class);//代理目标类
    //回调函数--执行目标类的方法
    enhancer.setCallback(new MethodInterceptor() {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    System.out.println("intercept begin...");
    return proxy.invokeSuper(obj,args);
    }
    });
    Print print = (Print) enhancer.create();
    print.doPrint("打印机");
    }
    通过设置目标类和回调函数后调create()方法就可以创建一个代理类处理,简单粗暴。。嘿嘿。。

    aop简单的学习demo

    配置spring文件中加入:

    <bean id="aopAdvisor" class="com.springapp.utils.AopAdvisor"/>
    <aop:config expose-proxy="false" proxy-target-class="false">
    <!-- 定义切面 -->
    <aop:aspect ref="aopAdvisor">
    <!-- 定义切入点 -->
    <aop:pointcut id="teacherService" expression="execution(* com.springapp.service.*.*(..))" />
    <!-- 定义前置 -->
    <aop:before method="before" pointcut-ref="teacherService"/>
    <!-- 引入 -->
    <aop:declare-parents types-matching="com.springapp..*.TeacherService+" implement-interface="com.springapp.service.AopParentService"
    default-impl="com.springapp.service.impl.AopParentServiceImpl"/>
    <!-- 定义后置 -->
    <aop:after method="after" pointcut-ref="teacherService"/>
    <!-- 环绕通知 -->
    <aop:around method="doAround" pointcut-ref="teacherService"/>
    </aop:aspect>
    </aop:config>

    @Slf4j
    public class AopAdvisor {
    public void before(JoinPoint point) {
    System.out.println("AopAdvisor类的before(),目标方法是:"+point);
    }
    public void after(JoinPoint point) {
    System.out.println("AopAdvisor类after(),目标方法是:"+point);
    }
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
    System.out.println("AopAdvisor类的doAround(),目标方法是:"+point);
    return point.proceed();
    }
    }
  • 相关阅读:
    字在线中
    关于页面显示层叠问题
    左边竖条
    jquery 动态添加元素事件绑定问题
    工作总结
    多文本输入,内容过多时输入框会自动撑开
    lunix常用命令
    springboot整合es availableProcessors is already set to [2], rejecting [2]
    mysql 主从复制架构
    elastic search 第一次安装 报错记录
  • 原文地址:https://www.cnblogs.com/tom-plus/p/5851608.html
Copyright © 2011-2022 走看看