Аннотации @PostConstruct и @PreDestroy не работают - PullRequest
0 голосов
/ 07 марта 2019

У меня есть класс 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 не работают правильно.Я не могу найти причину своей проблемы.

Ответы [ 4 ]

1 голос
/ 08 марта 2019

Spring может не обрабатывать аннотации жизненного цикла JSR-250 по умолчанию. Проверьте applicationContext.xml , что в нем есть элемент:

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

, который настраивает Spring для осведомления о @PostConstruct & @PrePersist.

Подробнее см. в этой статье .

1 голос
/ 08 марта 2019

Из документации Spring Core, параграф 1.9.8 - Using @PostConstruct and @PreDestroy

При условии, что CommonAnnotationBeanPostProcessor зарегистрирован в Spring ApplicationContext, метод, содержащий одну из этих аннотаций, вызывается в тот жеукажите в жизненном цикле соответствующий метод интерфейса жизненного цикла Spring или явно объявленный метод обратного вызова.

Объявление

<context:annotation-config/>

внутри вашего файла applicationContext.xml, неявно зарегистрируйте CommonAnnotationBeanPostProcessor.

В противном случае вам необходимо зарегистрировать его вручную, используя ( документы )

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
1 голос
/ 08 марта 2019

Если вы используете java 9+, тогда добавьте зависимость javax.annotation:javax.annotation-api (или используйте java 8).

Или используйте spring-boot 2, если вы используете spring-boot 1.

0 голосов
/ 08 марта 2019

Ваша весна не знает о аннотациях @PostContruct и @PreDestroy.Добавьте этот код в ваш applicationContext.xml

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

Или реализует интерфейсы InitializingBean, DisposableBean в вашем классе TenisCoach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...