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

Java17升级后手动注入的Spring Bean@PostConstructor未触发问题解决

Java17升级后@PostConstruct注解方法未触发的解决过程

环境信息

  • Spring Boot版本:2.7.15
  • Java版本从8升级至17

问题背景

升级Java版本后,为使用@PostConstruct注解,在pom.xml中添加了如下依赖:

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>${jakarta.annotation-api.version}</version>
</dependency>

项目包含多个Spring微服务(使用@Service等注解管理Bean),以及一个不依赖Spring的通用库CommonManager,核心代码示例如下:

CommonLibrary核心代码

public class ExampleEnvironmentClass {
    private Class<? extends ADao> aDaoClass = ADaoImpl.class;
    private Class<? extends AManager> aManagerClass = AManagerImpl.class;

    private Class<? extends BDao> bDaoClass = BDaoImpl.class;
    private Class<? extends BManager> bManagerClass = BManagerImpl.class;
}

public class ExampleManagerImpl implements ExampleManager {
    public ExampleManagerImpl(ExampleEnvironmentClass env) {
        this(env, null);
    }

    // 用于直接调用的重载构造方法
    public ExampleManagerImpl(ExampleEnvironmentClass env, Dao dao) {
        env.validate();
        // 其他初始化逻辑
    }

    @PostConstruct
    public void initialize() {
        // 注解标记的初始化逻辑
    }
}

微服务中Bean定义代码

在微服务里通过@Bean手动创建CommonLibrary的实例:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableScheduling
@Import({ DbConfiguration.class, CacheClientConfiguration.class, WebMvcConfiguration.class })
public class MySpringMicroService {
    @Bean
    public ExampleManager exampleManager() {
        ExampleEnvironmentClass env = new ExampleEnvironmentClass();

        env.aDaoClass(CustomADaoImpl.class);
        env.aManagerClass(CustomAManagerImpl.class);

        // env.bDaoClass(CustomBDaoImpl.class);
        env.bManagerClass(CustomAManagerImpl.class);

        return new ExampleManagerImpl(env);
    }
}

升级前该逻辑运行正常,但升级Java17后,ExampleManagerImpl中的@PostConstruct注解方法initialize()并未被触发。

排查尝试

尝试添加@ComponentScans注解扫描CommonLibrary包,问题未解决:

@ComponentScans({
    @ComponentScan("CommonLibraryPackage"),
    @ComponentScan("MyServicesOwnComponentPage") // 实际无需添加,仅作尝试
})

临时解决方案

手动调用initialize()方法替代注解触发:

// return new ExampleManagerImpl(env); // 替换为以下代码
ExampleManagerImpl obj = new ExampleManagerImpl(env);
obj.initialize();
return obj;

最终解决方案

将jakarta.annotation-api依赖替换为javax.annotation-api依赖,问题彻底解决:

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

内容的提问来源于stack exchange,提问作者Hasan Ünlü KILINÇ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:25