【Spring】注解(AOP)不生效原因分析以及解决方案

本文分析了在Spring中遇到注解不生效的问题,特别是当类内部直接调用方法时,事务注解无法正常工作的原因。文章解释了AOP的工作原理,即动态代理或CGLib子类化,指出直接使用`this`调用方法不会触发代理增强。为解决此问题,提出了三种获取代理对象的方法,包括通过@Autowired注解、从Spring上下文获取以及利用AopContext。
摘要由CSDN通过智能技术生成

一 问题

我们在使用spring的注解时,稍不注意就很有可能会遇到注解没有生效的情况,比如下面这段代码,在发生类内调用时就出现了问题,

import org.springframework.stereotype.Component;
 
@Component
public class HelloService {
     
    @Transactional
    public void sayHi(String msg) {
        //数据库操作
        doSomethingInDB();
        System.out.println("\tsayHi:" + msg);
        throw new RuntimeException();
    }
 
    public void anotherSayHi(String msg) {
        this.sayHi(msg);
    }
 
}


运行上面这段代码我们会发现,直接调用 sayHi()方法,事务有进行回滚操作,但是调用 anotherSayHi()方法时,事务注解却没有生效。

二 分析

这是什么原因呢?
显然HelloService中的anotherSayHi方法,并未被aop增强。 了解AOP原理的同学想必都知道,AOP的实现有二类,如果是基于接口的,会采用动态代理,生成一个代理类,如果是基于类的,会采用CGLib生成子类,然后在子类中扩展父类中的方法。然后在代理类中对原有方法进行增强。我们直接通过this去调用类内的 sayHi()方法,这种方式是

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring AOP未生效的原因可能有以下几种情况。 首先,如果要增强的类或方法没有被Spring管理,那么AOP就无法生效。这种情况下,需要将目标类或方法注入到Spring容器中才能实现AOP的增强效果。 其次,如果要被增强的类或方法同时被SpringSpring MVC扫描,可能会导致AOP失效。这是因为在Spring MVC容器中重新实例化的对象并没有被AOP代理,而是由Spring MVC容器直接管理。为了解决这个问题,我们需要确保AOP配置中的切点表达式声明与要切入的类和方法在同一个容器中。 另外,如果要增强的方法被同类的方法调用,也可能导致AOP不生效。这是因为AOP是在目标方法调用时才会生效,而同类的方法调用不会触发AOP。要解决这个问题,可以将目标方法抽取为单独的方法,然后在原来的方法和其他使用该方法的地方进行调用。 还有一种情况是,如果使用了注解方式进行AOP,但没有开启注解支持,也会导致AOP不生效。要解决这个问题,需要在Spring配置文件中添加注解支持的配置。 综上所述,要解决Spring AOP不生效的问题,需要注意以上几种情况,并根据具体情况进行相应的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Aop失效的情況及解决办法](https://blog.csdn.net/weixin_43790613/article/details/113091496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值