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

Micronaut中@Factory创建@Context Bean时@PostConstruct未触发问题

通过@Factory创建@Context作用域Bean时@PostConstruct不执行的解决方法

问题现象

  1. 直接标注@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...");
    }
}
  1. 通过@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...");
    }
}
  1. 注入调用Bean方法仍无法触发@PostConstruct
    即使创建另一个@Context Bean并注入调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:15:47