首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@PostConstruct和@PreDestroy注释不起作用

@PostConstruct和@PreDestroy注释不起作用
EN

Stack Overflow用户
提问于 2019-03-07 20:56:52
回答 5查看 2.5K关注 0票数 1

我有TennisCoach课程:

代码语言:javascript
复制
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";
    }
}

而这样的主要班级:

代码语言:javascript
复制
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注释不能正常工作。我找不到我出问题的原因。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-03-07 21:11:14

如果使用java 9+,则添加依赖项javax.annotation:javax.annotation-api (或使用java 8)。

或者使用弹簧引导2,如果你使用弹簧引导1.

票数 2
EN

Stack Overflow用户

发布于 2019-03-07 21:17:43

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

代码语言:javascript
复制
<beans ...
    <context:annotation-config/>
    ....
</beans>

它将Spring配置为了解@PostConstruct@PrePersist

有关更多信息,请参见这篇文章

票数 3
EN

Stack Overflow用户

发布于 2019-03-07 21:20:17

来自Spring Core文档的1.9.8 - Using @PostConstruct and @PreDestroy

如果CommonAnnotationBeanPostProcessor是在Spring ApplicationContext中注册的,则在生命周期中与相应的Spring生命周期接口方法相同的位置调用包含这些注释之一的方法,或者显式声明回调方法。

宣示

代码语言:javascript
复制
<context:annotation-config/>

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

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

代码语言:javascript
复制
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55052677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档