使用注解实现Bean生命周期时<context:annotation-config/>标签报错及注解失效问题
解决Spring注解式Bean生命周期的两个问题:context:annotation-config/报错与@PreConstruct/@PreDestroy不生效
一、搞定context:annotation-config/标签报错
- 先确认XML头部的context命名空间配置是否完整,缺了这个肯定报错:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - 确保Spring版本和schema版本匹配,要么在schemaLocation里指定对应版本(比如
http://www.springframework.org/schema/context/spring-context-5.3.xsd),要么直接省略版本号让Spring自动适配。 - 检查项目依赖里有没有spring-context模块,这是context命名空间的核心依赖,没加的话直接补进去。
二、让@PreConstruct/@PreDestroy生效
- 依赖要对应Spring版本:如果用的是Spring 5.3及以后,javax.annotation-api已经被淘汰了,必须换成jakarta.annotation-api(版本2.0以上):
要是用的Spring 5.3以前的版本,javax.annotation-api 1.3.2是没问题的,但得确认这个依赖没被其他依赖排除掉(可以用Maven的<!-- Maven依赖示例 --> <dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>2.1.1</version> <scope>provided</scope> </dependency>dependency:tree命令查)。 - 配置要到位:光加context:annotation-config/不够,如果你的Bean是用@Component这类注解注册的,必须再加<context:component-scan base-package="你的Bean所在包路径"/>——前者是处理已注册Bean的注解,后者是负责扫描并注册Bean,缺一个都不行。
- 检查Bean的状态:如果是手动用
标签注册的Bean,别开lazy-init="true",不然Bean没初始化肯定不会触发@PreConstruct;另外,容器关闭时要调用close()方法(比如ClassPathXmlApplicationContext的close()),不然@PreDestroy不会执行。 - 注解包别导错:别导入其他框架的同名注解,要确保用的是
javax.annotation.PostConstruct/javax.annotation.PreDestroy(Spring 5.3前)或者jakarta.annotation.PostConstruct/jakarta.annotation.PreDestroy(Spring 5.3后)。
内容的提问来源于stack exchange,提问作者Alyusha
相关产品推荐
相关产品推荐

