Java @PostConstruct和@PreDestroy注释不起作用
我有坦尼斯科课:Java @PostConstruct和@PreDestroy注释不起作用,java,spring,annotations,Java,Spring,Annotations,我有坦尼斯科课: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Pr
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class TennisCoach implements Coach {
@Autowired
@Qualifier("randomFortuneService")
private FortuneService fortuneService;
public TennisCoach() {
System.out.println("Inside default constructor");
}
@PostConstruct
public void doMyStartupStuff() {
System.out.println("Inside postconstructor");
}
@PreDestroy
public void doMyFinalStuff() {
System.out.println("Inside predestroyer");
}
@Override
public String getDailyFortune() {
return fortuneService.getFortune();
}
@Override
public String getDailyWorkout() {
return "Practice your backhand volley";
}
}
以及这样的主要类别:
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnotationBeanScopeDemoApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Coach theCoach = context.getBean("tennisCoach", Coach.class);
System.out.println(theCoach.getDailyFortune());
System.out.println(theCoach.getDailyWorkout());
context.close();
}
}
预期产出为:
内部默认构造函数
内部后构造
每日财富
练习反手截击
内预分解器
但我明白了:
内部默认构造函数
每日财富
练习反手截击
似乎@postcontract和@PreDestroy注释无法正常工作。我找不到问题的原因。如果使用java 9+,则添加依赖项
javax.annotation:javax.annotation api
(或使用java 8)
或者,如果您使用spring boot 1,则使用spring boot 2。如果您使用java 9+,则添加依赖项
javax.annotation:javax.annotation api
(或者使用java 8)
或者,如果使用spring boot 1,则使用spring boot 2。默认情况下,spring可能无法处理JSR-250生命周期注释。检查您的applicationContext.xml是否包含以下元素:
<beans ...
<context:annotation-config/>
....
</beans>
默认情况下,Spring可能不会处理JSR-250生命周期注释。检查您的applicationContext.xml是否包含以下元素:
<beans ...
<context:annotation-config/>
....
</beans>
来自弹簧芯
文档,段落1.9.8-使用@PostConstruct和@PreDestroy
前提是注册了CommonAnnotationBeanPostProcessor
在SpringApplicationContext
中,一种承载以下内容之一的方法
注释在生命周期中与
对应的Spring生命周期接口方法或显式声明
回调方法
宣布
<context:annotation-config/>
从Spring Core
文档第1.9.8段-使用@PostConstruct和@PreDestroy
前提是注册了CommonAnnotationBeanPostProcessor
在SpringApplicationContext
中,一种承载以下内容之一的方法
注释在生命周期中与
对应的Spring生命周期接口方法或显式声明
回调方法
宣布
<context:annotation-config/>
您的Spring不知道注释的@postcontract和@PreDestroy。
将此代码添加到applicationContext.xml中
<bean class = "org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
或者在TenisCoach类中实现InitializingBean、DisposableBean接口。您的Spring不知道注释的@PostContract和@PreDestroy。
将此代码添加到applicationContext.xml中
<bean class = "org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
或者在TenisCoach类中实现InitializingBean、DisposableBean接口。Eclipse无法导入@PostConstruct或@PreDestroy
这是因为Java9和更高版本
使用Java9及更高版本时,javax.annotation已从其默认类路径中删除。
解决方案
从下载javax.annotation-api-1.3.2.jar
将JAR文件复制到项目的lib文件夹中
使用以下步骤将其添加到Java构建路径
在项目上单击鼠标右键,选择“属性”
在左侧,单击Java构建路径
在对话框的顶部中间,单击“库”
单击类路径,然后单击添加JAR
导航到JAR文件/lib/javax.annotation-api-1.3.2.JAR
单击确定,然后单击应用并关闭
Eclipse将重新生成您的项目,并解决相关的生成错误。Eclipse无法导入@PostConstruct或@PreDestroy
这是因为Java9和更高版本
使用Java9及更高版本时,javax.annotation已从其默认类路径中删除。
解决方案
从下载javax.annotation-api-1.3.2.jar
将JAR文件复制到项目的lib文件夹中
使用以下步骤将其添加到Java构建路径
在项目上单击鼠标右键,选择“属性”
在左侧,单击Java构建路径
在对话框的顶部中间,单击“库”
单击类路径,然后单击添加JAR
导航到JAR文件/lib/javax.annotation-api-1.3.2.JAR
单击确定,然后单击应用并关闭
Eclipse将重新生成您的项目,并解决相关的生成错误。什么版本?Spring boot?不是Spring boot,只是Spring框架。5.1.4.发布什么版本?Spring boot?不是Spring boot,只是Spring框架。5.1.4.释放嗯,真奇怪。我使用的是Java7,不是SpringBoot,只是SpringFramework,但这种依赖性帮助了我。感谢you@GeorgeZorikov您以前是从哪个JAR导入注释的?@GeorgeZorikov没关系,但是从哪个JAR文件导入的?可能是您使用的JAR文件没有正确地复制到您的应用程序服务器中,以及您的工件。@LppEdd我意识到了原因。。。我认为javax不需要是一个显式依赖项,可以像java.util等一样导入。这太令人尴尬了。谢谢。嗯,真奇怪。我使用的是Java7,不是SpringBoot,只是SpringFramework,但这种依赖性帮助了我。感谢you@GeorgeZorikov您以前是从哪个JAR导入注释的?@GeorgeZorikov没关系,但是从哪个JAR文件导入的?可能是您使用的JAR文件没有正确地复制到您的应用程序服务器中,以及您的工件。@LppEdd我意识到了原因。。。我认为javax不需要是一个显式依赖项,可以像java.util等一样导入。这太令人尴尬了。非常感谢。