Cloud程序 2022-09-08 11:41 采纳率: 62.5%
浏览 64
已结题

SrpingAOP编写

问题遇到的现象和发生背景

今天复习Spring AOP遇到一个诡异的问题,在没编写切面类类之前,xml的扫描包功能一切正常,当编写完切面类后,扫描包功能失效,一早上都没解决,在此提问。

问题相关代码,请勿粘贴截图

applicationContext.xml如下:


    
    <context:component-scan base-package="cn.edu.jyu"/>

    <aop:aspectj-autoproxy/>
package cn.edu.jyu.mapper.impl;

import cn.edu.jyu.mapper.Dao;
import org.springframework.stereotype.Repository;

@Repository
public class IDao implements Dao {
    @Override
    public void show() {
        System.out.println("---被增强的show方法---");
    }
}
运行结果及报错内容

本来一切正常,运行后控制台打印 被增强的show方法

但当编写完切面类后,运行报错,期间并为修改任何包、类名、路径等:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.edu.jyu.mapper.impl.IDao' available

切面类如下:

package cn.edu.jyu.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class MyAdvice {

    /**
     * 前置通知 设置成mapper包下的所有子孙包下的所有类都能被增强
     * 其他包的方法没有被织入前置通知
     * @param join
     */
    @Before("execution(* cn.edu.jyu.mapper..*.*(..))")
    public void doBefore(JoinPoint join){
        System.out.println(join.getSignature().getName() + "---前置通知");
    }

    //异常通知
    @AfterThrowing("execution(* cn.edu.jyu.mapper..*.*(..))")
    public void doAfterThrowing(){
        System.out.println("异常通知");
    }

    @AfterReturning("execution(* cn.edu.jyu.mapper..*.*(..))")
    public void doAfterReturning(){
        System.out.println("后置通知");
    }

    /**
     * 后置通知切点表达式的访问修饰符设置成了 protected
     * public修饰符修饰的方法访问不到。
     */
    @After("execution(protected * cn.edu.jyu.mapper..*.*(..))")
    public void doAfter(){
        System.out.println("最终通知");
    }
}
我的解答思路和尝试过的方法

尝试过修改xml配置文件扫描包:


<context:component-scan base-package="cn.edu.jyu.mapper"/>

此时输出没有报错,但是切面方法显示 “This advice advises no methods”,而且想要的切入效果也没有。
如果改成:

    <context:component-scan base-package="cn.edu.jyu" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
    </context:component-scan>

运行结果再次报错:org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.edu.jyu.mapper.impl.IDao' available

删除其中的:

<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>

运行结果再次正确

我想要达到的结果

我已经很迷了,之前完全没有遇到过这种情况,是我代码编写错误?还是扫描包用法错误?还是什么,求解答,谢谢。

  • 写回答

3条回答 默认 最新

  • 壹升茉莉清 宇信科技高级开发工程师 2022-09-08 17:30
    关注

    spring的aop是使用的CGlib代理进行的动态代理,你设置为false就不会使用CGlib,这样就会导致aop出现问题,无法注册到spring容器,由于你的切面必须要spring容器管理才会生效,才能找到bean,所以你设置为FALSE,找不到bean,就会报错NoSuchBeanDefinitionException

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月16日
  • 已采纳回答 9月8日
  • 创建了问题 9月8日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么