스프링 부트 웹 애플리케이션에서 임베디드 웹 서버 (tomcat)가 들어오는 요청을 수신하기 전에 일부 코드가 실행되도록 할 수 있습니까?
REST API의 요청이 애플리케이션에서 응답하기 전에 실행해야하는 데이터베이스 마이그레이션 스크립트가 있습니다. 어떻게 할 수 있습니까? 지금은 마이그레이션 스크립트 구성 요소에서
@EventListener
...에 대한
ContextRefreshedEvent
그러나 그것은 너무 늦었습니다. 다음 줄은 이전에 이미 기록되었습니다.
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8091 (http) with context path ''
- 답변 # 1
- 답변 # 2
여기에서 적용한 다음 접근 방식을 사용했습니다.
@Component @RequiredBy(WebServerFactory.class) // initialize before web server listens for requests public class MigrationLogicApplicationRunner { ... } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface RequiredBy { Class<?> value(); } @Component public class RequiredByBeanDefinitionPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { for (String beanWithRequiredBy : beanFactory.getBeanNamesForAnnotation(RequiredBy.class)) { BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanWithRequiredBy); try { Class<?> beanClass = Class.forName(beanDefinition.getBeanClassName()); if (beanClass.isAnnotationPresent(RequiredBy.class)) { Class<?> dependant = beanClass.getAnnotation(RequiredBy.class).value(); for (String otherBeanName : beanFactory.getBeanNamesForType(dependant)) { BeanDefinition otherBeanDefinition = beanFactory.getBeanDefinition(otherBeanName); otherBeanDefinition.setDependsOn(ArrayUtils.add(otherBeanDefinition.getDependsOn(), beanWithRequiredBy)); } } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } }
자신
@RequiredBy
주석이 처리되고 사후 처리 단계에서 다른 Bean 정의에 "종속"을 추가합니다. 어노테이션 매개 변수는 대상 Bean의 (기본) 유형입니다.
관련 자료
- javascript - 프로세스를 더 위임하기 위해 함수가 실행되도록하는 방법은 무엇입니까?
- angular - 옷을 입기 전에 서비스가 완료되었는지 확인하십시오
- javascript - 객체를 사용하는 코드를 이동하기 전에 객체가 생성되도록하는 좋은 방법이 있습니까?
- java - 휘발성 변수를 사용하여 닫기 작업 전에 쓰기 작업이 수행되도록하려면 어떻게해야합니까?
- javascript - 계속하기 전에 모든 파일을 읽고 대기하는 모든 콜백을 기다리는 방법
- reactjs - render ()가 실행되기 전에 감속기에서 prop 값을 얻는 방법은 무엇입니까?
- reactjs - React/Redux 라우터 리디렉션 전에 JWT 유효성 검사가 발생하도록하는 방법은 무엇입니까?
- node.js - 그런 다음 약속 해결 전에 Node JS Promise가 실행 차단
- owasp - 활성 스캔 또는 크롤링을 실행하기 전에 인증 스크립트가 실행되지 않음
- javascript - firebase js api - on ()이 호출/종료되기 전에 'off ()'가 실행되는 것을 피하는 방법
- c# - " 'catch'블록이 실행되기 전에 런타임은 'finally'블록을 검사합니다 ', 이것이 무슨 의미입니까?
- go - 코드의이 부분이 다른 부분보다 먼저 실행되는 이유는 무엇입니까?
- angular - 공급자를 주입하기 전에 정적 변수가 초기화되었는지 확인
- javascript - cheeriocrawler - 데이터를 추출하기 전에 페이지가 완전히로드되도록하려면 어떻게해야합니까?
- azure devops - 에이전트 풀의 모든 에이전트가 릴리스 단계를 실행하도록하는 방법
- python - 동일한 프로그램 인스턴스에서 새 명령을 실행하기 전에 명령이 실행될 때까지 기다리는 방법이 있습니까?
- angular - 양식 필드에서 데이터가 사용되는 페이지 렌더링 전에 REST 서비스에서 데이터가 리턴되도록하는 방법
- python - 동일한 파이프 라인이 동시에 두 번 실행되지 않도록하려면 어떻게해야합니까?
- javascript - 약속 - 동기화 코드 후 및 비동기 코드 전에 해결이 실행되는 이유
데이터베이스 (저장소)에 연결하는 데 사용하는 Bean에서 @PostConstruct 메소드를 사용하고 스크립트를 실행하는 데 필요한 코드를 작성할 수 있습니다.이 코드는 Bean이 생성 된 후 서버가 실행되기 전에 실행됩니다.
예 : https://www.baeldung.com/spring-postconstruct-predestroy