springaop面向切面编程_简述面向切面编程思想

springaop面向切面编程_简述面向切面编程思想Spring理论基础-面向切面编程

大家好,又见面了,我是你们的朋友全栈君。

AOPAspect-Oriented Programming的缩写,中文翻译是面向切面编程。作为Spring的特征之一,是要好好学习的。

首先面向切面编程这个名称很容易让人想起面向对象编程(OOP)来。我们知道面向对象编程是从上往下的把系统拆分成若干个类,如Web项目中常见的ControllerServiceDao等分层。但是面向对象编程对于从左到右的水平抽象十分无力,类似于日志、权限等系统级功能的代码会重复的出现在任何地方。简单的说,面向切面编程是对面向对象编程的一种补充,它可以把系统里一些分散的重复代码集中在一起,抽象成一个切面。先来举一个例子:

有一个内部使用的管理系统,Controller中的每个接口在调用时都要记录下当前用户名称、当前时间等参数。

很明显这个需求的实现代码在每个接口中都是重复的。即使提取成公共类的公共方法,在每个接口里也都有一句该公共方法的调用,导致类之间的耦合。

接口流程图

我们希望把原来接口中的记录代码去除掉,使这些接口只关注自己的业务逻辑。然后使用预编译或运行期动态代理等方式实现在不修改接口代码的情况下,为接口添加记录功能。这种动态地将代码织入到类的指定方法、指定位置上的编程思想就是面向切面编程。

接口流程图(添加AOP)

概念

面向切面编程具体的一些概念。

《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第8章、《Spring实战》第4章:

  • 增强(advice,另译为通知,但《Spring3.x企业应用开发实战》作者不赞成):在特定连接点执行的动作。例子中的实现代码就是增强。
  • 切点(pointcut):一组连接点的总称,用于指定某个增强应该在何时被调用。例子中的指定哪些接口和指定位置就是切点。
  • 连接点(join point):在应用执行过程中能够插入切面的一个点。例子中具体的一个接口和指定位置的结合就是连接点。
  • 切面(aspect):通知(即增强)和切点的结合。

AOPSpring中主要是通过动态代理实现的,具体实现也分为两种:JDK动态代理CGLIB动态代理。其中JDK动态代理是基于接口代理,CGLIB动态代理是基于继承代理。

JDK动态代理

作为Java自带的一种动态代理技术,JDK动态代理的优势是使用反射技术来生成代理类,在生成效率上比较高。缺点是只能基于接口来动态代理,如果目标类没有实现任何接口是不能使用JDK动态代理的。

来看一个用JDK动态代理的例子。

public class DynamicProxy implements InvocationHandler {

    /**
     * 被代理类
     */
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public static Object bind(Object target) {
        InvocationHandler invocationHandler = new DynamicProxy(target);
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName() + " 方法执行前");
        //执行被代理类方法
        Object ret = method.invoke(target, args);
        System.out.println(method.getName() + " 方法执行后");
        return ret;
    }

    public static void main(String[] args) {
        Dao dao = new OrderDao();
        dao.doSomeThing();
        Dao daoProxy = (Dao) DynamicProxy.bind(dao);
        daoProxy.doSomeThing();
    }

}
public class OrderDao implements Dao {

    @Override
    public void doSomeThing() {
        System.out.println("test");
    }

}
public interface Dao {

    void doSomeThing();

}
输出:
test
doSomeThing 方法执行前
test
doSomeThing 方法执行后

Process finished with exit code 0

后记

这次只是梳理下概念,把自己理解的AOP概念写下来。也参考了很多文章,大体都是一致的细节上有些不同,把自己理解的写出来给大家看下就知道有没有错了。顺便整理一下,免得以后别人问起自己支支吾吾的不知道从哪说起。并没有去了解Spring中具体的AOP实现,有兴趣的同学可以自行深入了解下。

我的博客地址

参考资料

什么是面向切面编程AOP?

好书一起读(115):重学Spring之面向切面

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107377.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • numpy float转int_python字符串转float类型

    numpy float转int_python字符串转float类型查看数据类型print(image.dtype)unit8转换成float32先将图片转化为float32类型,再除以255,得到0-1之间的数importnumpyasnpimage=image.astype(np.float32)/255float32转换成uint8每个数乘以255,再转化为uint8importnumpyasnpimage=(image*255).astype(np.uint8)…

  • Unity3D入门Demo-Cube移动-触发球体-切换场景[通俗易懂]

    Unity3D入门Demo-Cube移动-触发球体-切换场景[通俗易懂]Unity3D入门Demo-Cube移动-触发球体-切换场景新建Unity3D项目–选择3D类型编写场景切换脚本ChangeScenes添加场景切换脚本到游戏物体并保存Menu场景新建Game游戏主场景,并添加方块和两个球体编写Cube移动脚本MoveCube编写Cube触发球体脚本TriggerEnter创建返回按钮并配置逻辑,保存Game场景创建Win场景和Lose场景将场景添加到Build…

  • 在CMD命令行中切换到管理员权限模式「建议收藏」

    在CMD命令行中切换到管理员权限模式「建议收藏」1、打开CMD2、输入:runas/noprofile/user:Administratorcmd3、输入Administrator账户的密码,必须设置密码PS:可以不是Administrator账户,只要是具有管理员权限的账号都可,例如ASUS等。runas/noprofile/user:ASUScmd然后输入ASUS账号的密码run…

    2022年10月16日
  • L2-004这是二叉搜索树吗(二叉搜索树)

    L2-004这是二叉搜索树吗(二叉搜索树)原题链接一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或

  • docker镜像操作_docker 运行镜像

    docker镜像操作_docker 运行镜像前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

  • LightGBM 调参方法(具体操作)

    LightGBM 调参方法(具体操作)

    2021年11月21日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号