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

