복붙노트

[SPRING] @PostConstruct 주석 및 스프링 수명주기

SPRING

@PostConstruct 주석 및 스프링 수명주기

나는 봄에 새로운데, 나는 알고 싶다 :

@Component (spring) 주석이 달린 Java 클래스가 있고 내부에 @PostConstruct로 주석 된 메서드가 있습니다. 클래스는 다른 클래스의 @Autowired 주석 필드에 의해 참조됩니다. @PostConstruct가 호출 된 후에 만 ​​클래스가 삽입된다고 가정 할 수 있습니까?

@Component
class AuthenticationMetrics {

  private static final MetricRegistry metrics = new MetricRegistry();

  final Counter requestsTotal

  final Meter guestLogins

  final Meter kfUserLogins

  final Timer guestLoginResponseTime

  final Timer kfLoginResponseTime

  @PostConstruct
  public void populateMetricsRegistry() {

    metrics.counter("authentication.requests.totals")

  }

}

해결법

  1. ==============================

    1.해당 빈에서 @PostConstruct가 호출 된 후 발생하는 주어진 클래스의 주입이라고 묻는 경우 대답은 '예'입니다. @PostConstruct는 bean이 "injectable"으로 간주되기 전에 실행됩니다.

    해당 빈에서 @PostConstruct가 호출 된 후 발생하는 주어진 클래스의 주입이라고 묻는 경우 대답은 '예'입니다. @PostConstruct는 bean이 "injectable"으로 간주되기 전에 실행됩니다.

    모든 빈칸에 대한 주입이 완료된 후 (주어진 빈에) @PostConstruct가 실행되는지 묻는다면, - 예 - @PostConstruct는 주어진 bean에게 주입이 커밋 된 후에 실행됩니다. 이것이 존재하는 이유입니다. 일반적으로 @PostConstruct 액션을 생성자에 넣을 수 있습니다. 그러나 새 객체가 생성되면 (생성자가 호출 될 때) 주입이 아직 수행되지 않습니다. 따라서 주입 된 객체에 의존하는 초기화는 NPE로 인해 실패합니다. 그래서 @PostConstruct가 필요합니다.

  2. ==============================

    2.@PostConstruct, @Resource, @PreDestroy와 같은 주석 처리는 BeanPostProcessor (이 경우 CommonAnnotationBeanPostProcessor)를 통해 수행됩니다. 다음 다이어그램에서 봄부터 BPP가 Dependency Injection 후에 처리되지만 Bean Ready For Use (이는 주사 가능한만큼 의미 있음)를 볼 수 있습니다.

    @PostConstruct, @Resource, @PreDestroy와 같은 주석 처리는 BeanPostProcessor (이 경우 CommonAnnotationBeanPostProcessor)를 통해 수행됩니다. 다음 다이어그램에서 봄부터 BPP가 Dependency Injection 후에 처리되지만 Bean Ready For Use (이는 주사 가능한만큼 의미 있음)를 볼 수 있습니다.

  3. from https://stackoverflow.com/questions/44681142/postconstruct-annotation-and-spring-lifecycle by cc-by-sa and MIT license