[SPRING] Spring Controller의 Init 메소드 (주석 버전)
SPRINGSpring Controller의 Init 메소드 (주석 버전)
저는 컨트롤러를 새로운 주석 버전으로 변환하고 있습니다. 이전 버전에서는 springmvc-servlet.xml의 init 메소드를 다음과 같이 지정했습니다.
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
주석 버전을 사용하여 init 메소드를 지정하려면 어떻게해야합니까?
해결법
-
==============================
1.당신이 사용할 수있는
당신이 사용할 수있는
@PostConstruct public void init() { // ... }
-
==============================
2.또는 Bean이 생성 될 때 ApplicationContext가 호출 할 콜백 함수 (afterPropertiesSet ())를 제공하기 위해 클래스가 InitializingBean 인터페이스를 구현하게 할 수 있습니다.
또는 Bean이 생성 될 때 ApplicationContext가 호출 할 콜백 함수 (afterPropertiesSet ())를 제공하기 위해 클래스가 InitializingBean 인터페이스를 구현하게 할 수 있습니다.
-
==============================
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.
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 } }
from https://stackoverflow.com/questions/5419695/init-method-in-spring-controller-annotation-version by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Java 예제 : Quartz를 사용한 동적 작업 스케줄링 (0) | 2019.03.01 |
---|---|
[SPRING] 스프링 3 JSON (MVC 포함) (0) | 2019.03.01 |
[SPRING] 스프링 데이터 나머지로 n + 1 쿼리를 피하는 방법은 무엇입니까? (0) | 2019.03.01 |
[SPRING] OSGi로 JSF / Facelets / Spring 애플리케이션을 모듈화하는 방법은 무엇입니까? (0) | 2019.03.01 |
[SPRING] 스프링 부트 devtools - IntelliJ에서 정적 컨텐츠 다시로드가 작동하지 않습니다. (0) | 2019.03.01 |