You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut中@Factory创建的Bean无法触发Around advice如何解决?

问题原因

Micronaut的AOP拦截逻辑基于编译期生成的子类代理实现:

  • 直接为MyService添加@Singleton注解时,Micronaut会在编译阶段自动生成继承自MyService的代理类,代理类会重写所有带AOP注解的方法,插入拦截器调用逻辑。容器内托管的MyService实例本质是代理类的对象,调用对应方法时就会触发拦截逻辑。
  • 使用工厂方式创建Bean时,工厂方法内手动通过new MyService()返回的是原始类的未增强实例,没有包含AOP代理逻辑,因此调用方法不会触发拦截器。
解决方案

根据你的使用场景可以选择以下任意一种方案:

  • 方案1:复用容器自动生成的增强实例
    如果不需要自定义MyService的构造逻辑,直接在工厂方法中注入容器已经生成好的增强实例即可,可在返回前执行自定义初始化操作:
@Factory
public class MyTestConfig {

    @Singleton
    public MyService myService(MyService enhancedService){
        // 此处可添加自定义初始化逻辑
        return enhancedService;
    }
}
  • 方案2:手动触发实例增强
    如果必须手动创建实例(比如需要传入自定义构造参数),可以通过BeanContext的initialize方法对裸实例执行AOP增强:
@Factory
public class MyTestConfig {

    @Singleton
    public MyService myService(BeanContext beanContext){
        MyService rawInstance = new MyService();
        // initialize方法会自动完成依赖注入、AOP代理包装等操作
        return beanContext.initialize(rawInstance);
    }
}

注意:使用子类代理策略时,需要确保MyService类和要拦截的buildFoo方法没有被final修饰,否则无法生成代理类导致拦截失败。

内容的提问来源于stack exchange,提问作者Eager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:24:03