복붙노트

[SPRING] Spring Controller의 Init 메소드 (주석 버전)

SPRING

Spring Controller의 Init 메소드 (주석 버전)

저는 컨트롤러를 새로운 주석 버전으로 변환하고 있습니다. 이전 버전에서는 springmvc-servlet.xml의 init 메소드를 다음과 같이 지정했습니다.

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

주석 버전을 사용하여 init 메소드를 지정하려면 어떻게해야합니까?

해결법

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

    1.당신이 사용할 수있는

    당신이 사용할 수있는

    @PostConstruct
    public void init() {
       // ...
    }
    
  2. ==============================

    2.또는 Bean이 생성 될 때 ApplicationContext가 호출 할 콜백 함수 (afterPropertiesSet ())를 제공하기 위해 클래스가 InitializingBean 인터페이스를 구현하게 할 수 있습니다.

    또는 Bean이 생성 될 때 ApplicationContext가 호출 할 콜백 함수 (afterPropertiesSet ())를 제공하기 위해 클래스가 InitializingBean 인터페이스를 구현하게 할 수 있습니다.

  3. ==============================

    3.Spring의 초기화 프로세스를 가로채는 몇 가지 방법이있다. 모든 빈을 초기화하고 autowire / inject해야한다면 적어도 두 가지 방법이 있습니다. 나는 두 번째 testet 만 가지고 있지만 나는 둘 다 똑같이 일한다고 믿는다.

    Spring의 초기화 프로세스를 가로채는 몇 가지 방법이있다. 모든 빈을 초기화하고 autowire / inject해야한다면 적어도 두 가지 방법이 있습니다. 나는 두 번째 testet 만 가지고 있지만 나는 둘 다 똑같이 일한다고 믿는다.

    @Bean을 사용하고 있다면, initMethod로 참조 할 수 있습니다.

    @Configuration
    public class BeanConfiguration {
    
      @Bean(initMethod="init")
      public BeanA beanA() {
        return new BeanA();
      }
    }
    
    public class BeanA {
    
      // method to be initialized after context is ready
      public void init() {
      }
    
    } 
    

    @Component를 사용하는 경우 이와 같이 @EventListener로 주석을 달 수 있습니다.

    @Component
    public class BeanB {
    
      @EventListener
      public void onApplicationEvent(ContextRefreshedEvent event) {
      }
    }
    

    제 경우에는 Spring Boot가 선택된 프레임 워크 인 IoC / DI를 사용하고있는 기존 시스템이 있습니다. 이전 시스템은 테이블에 많은 순환 종속성을 제공하므로 setter 종속성을 많이 사용해야합니다. setter에 의한 autowiring / injection은 아직 완료되지 않았기 때문에 @PostConstruct를 신뢰할 수 없기 때문에 그로 인해 두통을 겪었습니다. 순서는 생성자, @PostConstruct, autowired setters입니다. 나는 모든 빈에 대해 "같은"시간에 마지막으로 실행되는 @EventListener 주석으로 해결했다. 이 예제는 InitializingBean의 구현을 보여줍니다.

    서로에 대한 의존성을 가진 두 개의 클래스 (@Component)가 있습니다. 이 예제의 목적을 위해 클래스 중 하나만 표시되는 클래스는 같습니다.

    @Component
    public class BeanA implements InitializingBean {
      private BeanB beanB;
    
      public BeanA() {
        log.debug("Created...");
      }
    
      @PostConstruct
      private void postConstruct() {
        log.debug("@PostConstruct");
      }
    
      @Autowired
      public void setBeanB(BeanB beanB) {
        log.debug("@Autowired beanB");
        this.beanB = beanB;
      }
    
      @Override
      public void afterPropertiesSet() throws Exception {
        log.debug("afterPropertiesSet()");
      }
    
      @EventListener
      public void onApplicationEvent(ContextRefreshedEvent event) {
        log.debug("@EventListener");
      } 
    }
    

    이것은 컨테이너가 시작될 때 호출 순서를 보여주는 로그 출력입니다.

    2018-11-30 18:29:30.504 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : Created...
    2018-11-30 18:29:30.509 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : Created...
    2018-11-30 18:29:30.517 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @Autowired beanA
    2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @PostConstruct
    2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : afterPropertiesSet()
    2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @Autowired beanB
    2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @PostConstruct
    2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : afterPropertiesSet()
    2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @EventListener
    2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @EventListener
    

    당신이 볼 수 있듯이 @EventListener는 모든 것이 준비되고 구성된 후에 마지막으로 실행됩니다.

  4. ==============================

    4.

    public class InitHelloWorld implements BeanPostProcessor {
    
       public Object postProcessBeforeInitialization(Object bean,
                 String beanName) throws BeansException {
           System.out.println("BeforeInitialization : " + beanName);
           return bean;  // you can return any other object as well
       }
    
       public Object postProcessAfterInitialization(Object bean,
                 String beanName) throws BeansException {
           System.out.println("AfterInitialization : " + beanName);
           return bean;  // you can return any other object as well
       }
    
    }
    
  5. from https://stackoverflow.com/questions/5419695/init-method-in-spring-controller-annotation-version by cc-by-sa and MIT license