@PostConstruct和@PreDestroy注释不起作用

时间:2019-03-07 20:56:52

标签: java spring annotations

我有TennisCoach课:

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();
    }
}

预期输出为:

  

内部默认构造函数

     

内部构造函数

     

DailyFortune

     

练习反手抽射

     

驱逐舰内部

但是我明白了:

  

内部默认构造函数

     

DailyFortune

     

练习反手抽射

@PostContruct和@PreDestroy批注似乎无法正常工作。我找不到问题的原因。

5 个答案:

答案 0 :(得分:1)

如果您使用Java 9+,则添加依赖项 for(i in 1:8){ x=0 for(j in 1:8){ if(df[i,1]==df[j,1]){x=x+df[j,2]}} df[i,3]=x } df[,2]=df[,3] (或使用Java 8)。

或者如果使用spring-boot 1,则使用spring-boot 2。

答案 1 :(得分:1)

默认情况下,Spring可能不处理JSR-250生命周期注释。检查您的 applicationContext.xml 是否具有元素:

<beans ...
    <context:annotation-config/>
    ....
</beans>

将Spring配置为了解@PostConstruct@PrePersist

更多信息,请参见this article

答案 2 :(得分:1)

Spring Core文档中,第1.9.8 - Using @PostConstruct and @PreDestroy

  

提供CommonAnnotationBeanPostProcessor已注册   在Spring ApplicationContext中,一种承载以下方法之一的方法   注释在生命周期中与   相应的Spring生命周期接口方法或显式声明   回调方法。

声明

<context:annotation-config/>

applicationContext.xml文件中,隐式注册一个CommonAnnotationBeanPostProcessor

否则,您需要使用(docs)手动注册

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

答案 3 :(得分:0)

您的Spring不知道注释的@PostContruct和@PreDestroy。 将此代码添加到您的applicationContext.xml

<bean class = "org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

或在TenisCoach类中实现InitializingBean,DisposableBean接口。

答案 4 :(得分:0)

Eclipse无法导入@PostConstruct或@PreDestroy

发生这种情况是因为Java 9和更高版本。

使用Java 9和更高版本时,javax.annotation已从其默认类路径中删除。 解决方案

  1. 下载javax.annotation-api-1.3.2.jar

maven.org

  1. 将JAR文件复制到项目的lib文件夹中

使用以下步骤将其添加到Java构建路径中。

  1. 右键单击您的项目,选择“属性”

  2. 在左侧,单击Java Build Path

  3. 在对话框的顶部中心,单击“库”

  4. 单击“类路径”,然后单击“添加JAR ...”。

  5. 导航到JAR文件/lib/javax.annotation-api-1.3.2.jar

  6. 单击“确定”,然后单击“应用并关闭”

Eclipse将对您的项目进行重建,并将解决相关的构建错误。