为什么要使用AOP代理对象来调用自己的方法

发布时间 2023-09-26 14:59:24作者: kisshappyboy
   @Override
    public List<TreeSelect> selectDeptTreeList(SysDept dept)
    {
        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        return buildDeptTreeSelect(depts);
    }  

** 这里为什么要获取代理对象进行方法调用**

在这段代码中,通过 SpringUtils.getAopProxy(this) 获取代理对象进行方法调用的主要目的是确保方法调用时能够触发 AOP 的增强逻辑。

通常情况下,Spring AOP 会基于代理模式,在目标对象的方法执行前后织入额外的逻辑。这些额外的逻辑可以包括事务管理、日志记录、安全验证等。在使用 Spring AOP 时,通过获取代理对象进行方法调用,可以确保这些增强逻辑得以执行。

在这里,selectDeptTreeList 方法内部调用了 this.selectDeptList(dept) 方法,而 this 是当前对象。如果直接通过 this.selectDeptList(dept) 进行方法调用,那么实际调用的是当前对象的原始方法,而不会触发 AOP 的增强逻辑。

通过 SpringUtils.getAopProxy(this) 获取代理对象之后,再调用 selectDeptList(dept) 方法,就可以确保调用的是代理对象的方法,从而触发 AOP 的增强逻辑。

总结来说,通过获取代理对象进行方法调用是为了确保能够触发 AOP 的增强逻辑,以实现诸如事务管理、日志记录等功能。

使用代理对象进行方法调用需要注意以下情况:

对象内部调用:当一个对象的方法内部调用其他方法时,如果希望触发 AOP 的增强逻辑,那么应该使用代理对象进行方法调用,而不是直接使用 this 关键字。这样可以确保调用的是代理对象的方法,从而触发 AOP。

异步方法调用:如果在一个异步方法中需要调用其他方法,并希望触发 AOP 的增强逻辑,同样需要使用代理对象进行方法调用。因为异步方法的执行通常是在新的线程中进行的,直接使用 this 关键字无法触发 AOP。

在同一个类中调用其他方法:如果在同一个类中的方法之间相互调用,并且希望触发 AOP 的增强逻辑,也需要使用代理对象进行方法调用。因为在同一个类中,直接使用 this 关键字调用方法不会触发 AOP。

除了涉及到 this 调用的情况外,还有其他情况也需要注意使用代理对象进行方法调用。例如,当一个对象被注入到其他对象中,并且需要触发 AOP 增强逻辑时,应该使用注入对象的代理对象进行方法调用,而不是直接使用原始对象。

总之,需要注意的是,在希望触发 AOP 的场景下,使用代理对象进行方法调用能够确保增强逻辑的执行,而直接使用 this 关键字调用方法则不会触发 AOP。

在正常的 CRUD(Create, Read, Update, Delete)操作中,通常不需要使用代理对象。代理对象通常用于实现一些横切关注点(cross-cutting concerns),如日志记录、事务管理、安全性检查等方面的操作。


@Override
    @DataScope(deptAlias = "d")
    public List<SysDept> selectDeptList(SysDept dept)
    {
        return deptMapper.selectDeptList(dept);
    }

    /**
     * 查询部门树结构信息
     * 
     * @param dept 部门信息
     * @return 部门树信息集合
     */
    @Override
    public List<TreeSelect> selectDeptTreeList(SysDept dept)
    {
        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        return buildDeptTreeSelect(depts);
    }     

这里调用selectDeptList 使用代理对象,是为了 selectDeptList 的自定义注解生效还是为了其他什么

在上述代码中,selectDeptTreeList 方法通过调用 selectDeptList 方法来获取部门列表,并构建部门树结构信息。为了确保 selectDeptList 方法上的自定义注解 @DataScope 生效,使用代理对象来调用该方法是必要的。

自定义注解 @DataScope 可能是用于实现数据权限控制的功能。通过在 selectDeptList 方法上添加该注解,可以在查询部门列表时根据当前用户的角色或权限进行数据过滤,只返回符合权限的部门信息。为了让注解生效,需要使用 AOP 框架创建代理对象,在代理对象上添加拦截器来实现注解相关的增强逻辑。

在 selectDeptTreeList 方法中,通过 SpringUtils.getAopProxy(this) 获取当前对象的代理对象,并调用代理对象的 selectDeptList 方法。这样可以确保在调用方法时,会触发代理对象上定义的增强逻辑,包括 @DataScope 注解所定义的数据过滤操作。

总结起来,使用代理对象调用 selectDeptList 方法是为了确保 @DataScope 注解生效,以实现数据权限控制的功能。代理对象能够在方法调用前后插入自定义的处理逻辑,从而增强方法的功能。