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
相关产品推荐
相关产品推荐

