美文网首页
AOP简称面向切面编程 超级重要

AOP简称面向切面编程 超级重要

作者: 杨不易呀 | 来源:发表于2019-12-12 15:47 被阅读0次

AOP简介

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


开发存在 的问题 

在我们想不破坏源码的情况下 插入某个功能  使用AOP横向抽取机制取代了传统的 纵向继承

JDK动态代理


package com.itlike.demo1;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class GoodsJDKProxy {

    public GoodsDao createProxy(GoodsDao goodsDao) {

        // 增强代码  使用JDK动态代理

        GoodsDao goodsDaoProxy = (GoodsDao) Proxy.newProxyInstance(

                goodsDao.getClass().getClassLoader(),// 加载对象

                goodsDao.getClass().getInterfaces(),// 接口

                new InvocationHandler() { // 匿名内部类

                    /* 当调用对象的使用所以的方法都会来到这里 */

                    @Override  // 这个方法并不是立即执行 ,而是当代理对象里面的 方法执行时才会来到invoke

                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        /* 当前代理对象方法到这里时执行 */

                        if("save".equals(method.getName())){

                        System.out.println("权限校验---进行做处理"); // 假如是一个功能

                            GoodsDao goodsDao1 = (GoodsDao) method.invoke(goodsDao, args); // 获取到代理对象

                            System.out.println("日志添加");

                            return goodsDao1; // 返回代理对象

                        }

                        return method.invoke(goodsDao, args);

                    }// 回调

                });

        /* 当代理对象里面的方法执行的时候就会来到 回调 */

        return goodsDaoProxy;

    }

}

cglib动态代理

package com.itlike.demo1;

import org.springframework.cglib.proxy.Enhancer;

import org.springframework.cglib.proxy.MethodInterceptor;

import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserDaoCglibProxy implements MethodInterceptor {

    public UserDao createCglibProxy(UserDao userdao){

        // 1.创建核心类

        Enhancer enhancer = new Enhancer();

        // 2.设置父类  使用的是继承的方式 创建一个子类,自动的继承 userDao

        enhancer.setSuperclass(userdao.getClass());// 创建出来的类继承谁

// 3.设置回调

        enhancer.setCallback(this);

        // 4.创建代理对象 就是把子类给你

        UserDao obj = (UserDao) enhancer.create();

        return obj;

    };

    @Override

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        if("save".equals(method.getName())){

            System.out.println("权限----------");

            return  methodProxy.invokeSuper(o, objects);

        }

        return  methodProxy.invokeSuper(o, objects);

    }

}

Cglig是一个第三方开源代码 生成类库,动态添加类的属性和方法。在spring的核心包当中已经引入了cglib

采用的是继承方式来产生的代理对象

Spring的AOP简介 AOP思想最早是由AOP联盟组织提出的 Spring使用这种思想最好的框架 AspectJ Spring的AOP有自己的实现方式,但是这种方式非常繁琐 AspectJ 是一个AOP的框架 Spring放弃了自己传统的方式 ,引入AspectJ作为自身AOP的开发

相关文章

网友评论

      本文标题:AOP简称面向切面编程 超级重要

      本文链接:https://www.haomeiwen.com/subject/sftudqtx.html