Micronaut中@Factory创建@Context Bean时@PostConstruct未触发问题
通过@Factory创建@Context作用域Bean时@PostConstruct不执行的解决方法
问题现象
- 直接标注@Context的Bean正常执行@PostConstruct
当直接给类添加@Context注解时,@PostConstruct方法能正常执行:
package com.example; import io.micronaut.context.annotation.Context; import javax.annotation.PostConstruct; @Context public class ClassHello1 { @PostConstruct public void sayHello() { System.out.println("Hello from ClassHello1"); } public void doSmth() { System.out.println("Doing something..."); } }
- 通过@Factory创建@Context Bean时@PostConstruct失效
移除ClassHello1上的@Context注解,改用@Factory类的方法标注@Context来创建Bean时,@PostConstruct方法不会执行:
package com.example; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Factory; @Factory public class FactoryClass { @Context public ClassHello1 classHello1() { return new ClassHello1(); } }
package com.example; import javax.annotation.PostConstruct; public class ClassHello1 { @PostConstruct public void sayHello() { System.out.println("Hello from ClassHello1"); } public void doSmth() { System.out.println("Doing something..."); } }
- 注入调用Bean方法仍无法触发@PostConstruct
即使创建另一个@ContextBean并注入调用ClassHello1的方法,其@PostConstruct依然不执行:
package com.example; import io.micronaut.context.annotation.Context; import jakarta.inject.Inject; import javax.annotation.PostConstruct; @Context public class ClassHello2 { @Inject private ClassHello1 classHello1; @PostConstruct public void init() { classHello1.doSmth(); } }
此时classHello1.doSmth()能正常调用,但sayHello()(标注@PostConstruct)始终不执行。
解决方案
问题根源在于:手动new ClassHello1()创建的实例,Micronaut不会自动处理其生命周期回调(如@PostConstruct)。要让@PostConstruct生效,需让Micronaut负责Bean的实例化过程,通过BeanContext的createBean方法创建实例即可触发所有生命周期回调。
修改后的FactoryClass代码如下:
package com.example; import io.micronaut.context.BeanContext; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Factory; import jakarta.inject.Inject; @Factory public class FactoryClass { private final BeanContext beanContext; @Inject public FactoryClass(BeanContext beanContext) { this.beanContext = beanContext; } @Context public ClassHello1 classHello1() { // 由BeanContext创建实例,触发@PostConstruct等生命周期回调 return beanContext.createBean(ClassHello1.class); } }
这样修改后,ClassHello1的@PostConstruct方法就会在Bean创建时正常执行。
内容的提问来源于stack exchange,提问作者nikiforov.java
相关产品推荐
相关产品推荐

