Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @PostConstruct和@PreDestroy注释不起作用_Java_Spring_Annotations - Fatal编程技术网

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
在Spring
ApplicationContext
中,一种承载以下内容之一的方法 注释在生命周期中与 对应的Spring生命周期接口方法或显式声明 回调方法

宣布

<context:annotation-config/>

Spring Core
文档第
1.9.8段-使用@PostConstruct和@PreDestroy

前提是注册了
CommonAnnotationBeanPostProcessor
在Spring
ApplicationContext
中,一种承载以下内容之一的方法 注释在生命周期中与 对应的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等一样导入。这太令人尴尬了。非常感谢。