SpringBoot 자원 초기 화 로드 방식

문제
평소 업무 모듈 개발 과정 에서 전체적인 임무,캐 시,스 레 드 등 초기 화 작업 을 해 야 할 수 있 습 니 다.그러면 이 문 제 를 어떻게 해결 합 니까?방법 은 여러 가지 가 있 지만 구체 적 으로 어떻게 선택해 야 합 니까?
2.자원 초기 화
1.자원 초기 화 를 하려 면 springboot 시작 과정 을 알 아야 합 니 다.(여기 서 대체적으로 시작 과정,상세:https://www.jb51.net/article/133648.htm

앞의 분석 에 따 르 면 Spring-boot 용기 의 작 동 절 차 는 전체적으로 2 부분 으로 나 눌 수 있다.
  • 실행 설명:지정 한 범위 의 bean 을 스 캔 하고 자동 설정 류 에 대응 하 는 bean 을 IOC 용기 에 불 러 옵 니 다.
  • man 방법 에서 구체 적 인 SpringAppliocation.run(),전체 절 차 는 SpringApplicationEvent(전형 적 인 spring 이벤트 구동 모델)를 관통 하고 6 개의 키 가 있 습 니 다.
  • ApplicationFailedEvent.class
  • ApplicationPreparedEvent.class
  • ApplicationReadyEvent.class
  • ApplicationStartedEvent.class
  • ApplicationStartingEvent.class
  • SpringApplicationEvent.class
  • 2.CommandLine Runner 와 ApplicationRunner
    위 에서 알 수 있 듯 이 우 리 는 이 두 개의 인 터 페 이 스 를 실현 하면 우리 의 자원 초기 화 임 무 를 완성 할 수 있 습 니 다.그들의 로드 는 용기 가 완전히 시작 되 기 전에 볼 수 있 습 니 다.이 두 가지 차이 점 은 전자의 run 방법 매개 변 수 는 String..args 이 고 문자열 에 직접 들 어 갑 니 다.후자 의 매개 변 수 는 ApplicationArguments 로 매개 변 수 를 봉인 하 였 습 니 다.기능 상 으로 는 같다.또한@Order 주 해 를 사용 하여 자원 로드 의 우선 순 위 를 실현 할 수 있 습 니 다.값 이 작 을 수록 우선 순위 가 높 습 니 다.실례 는 다음 과 같다.
    
    @Component
    @Order(1)
    public class MyCommandLineRunner implements CommandLineRunner {
    
        @Override
        public void run(String... args) throws Exception {
            System.out.println("...init resources by implements CommandLineRunner");
        }
    }
    
    @Component
    @Order(2)
    public class MyApplicationRunner implements ApplicationRunner {
    
        @Override
        public void run(ApplicationArguments applicationArguments) throws Exception {
            System.out.println("...init resources by implements ApplicationRunner");
        }
    }
    3、@PostConstruct
    구체 적 인 Bean 의 실례 화 과정 에서 실 행 됩 니 다.@PostConstruct 주해 방법 은 구조 방법 다음 에 실 행 됩 니 다.순서 가 Constructor>@Autowired>@PostConstruct>정적 방법 이기 때문에 이 주 해 는 구조 방법 에서 의존 구성 요 소 를 사용 해 야 하 는 어색 함 을 피 할 수 있 습 니 다.(이에 대응 하 는 것 은@PreDestroy 도 있 습 니 다.대상 이 사라 지기 전에 실 행 됩 니 다.원리 차 가 많 지 않다.사용 특징 은 다음 과 같 습 니 다.
  • 이 주 해 를 사용 할 수 있 는 비 정태 적 인 방법 만 있 습 니 다
  • 주 해 된 방법 은 어떠한 매개 변수
  • 도 있어 서 는 안 된다.
  • 주 해 된 방법 반환 값 은 void
  • 여야 합 니 다.
  • 피 주해 방법 은 검사 이상
  • 을 던 져 서 는 안 된다.
  • 이 방법 은 한 번 만 실 행 됩 니 다
  • 
    @Component
    public Class AAA {    
        @Autowired    
        private BBB b;   
    
        public AAA() {        
            System.out.println("  b     : b = " + b);    
        }    
        @PostConstruct    
        private void init() {        
            System.out.println("  b     : b = " + b);    
        }
    }
    4、InitializingBean
    InitializingBean 은 Spring 이 제공 하 는 인터페이스 로 하나의 방법 만 포함 합 니 다.after PropertiesSet().이 인터페이스의 클래스 를 실현 하면 해당 하 는 Bean 이 Spring 에 의 해 관리 되 고 필요 한 속성 이 모두 설정 되면 Spring 은 이 Bean 의 after PropertiesSet()을 호출 합 니 다.빈 이 실례 화 하 는 과정 에서 실행 순 서 는 Constructor>@PostConstruct>InitializingBean>init-method 입 니 다.
    
    public class InitSequenceBean implements InitializingBean {   
        
        public InitSequenceBean() {   
           System.out.println("InitSequenceBean: constructor");   
        }   
          
        @PostConstruct  
        public void postConstruct() {   
           System.out.println("InitSequenceBean: postConstruct");   
        }   
          
        public void initMethod() {   
           System.out.println("InitSequenceBean: init-method");   
        }   
          
        @Override  
        public void afterPropertiesSet() throws Exception {   
           System.out.println("InitSequenceBean: afterPropertiesSet");   
        }   
    }
    5、ApplicationListener
    applicationListener 는 spring 의 모니터 로 사건 을 감청 할 수 있 고 전형 적 인 관찰자 모델 입 니 다.용기 에 애플 리 케 이 션 Listener Bean 이 있 으 면 애플 리 케 이 션 Context 가 애플 리 케 이 션 이 벤트 를 발표 할 때마다 애플 리 케 이 션 Listener Bean 이 자동 으로 실 행 됩 니 다.이 이벤트 메커니즘 은 프로그램 이 표시 하 는 트리거 가 필요 합 니 다.그 중에서 spring 은 내 장 된 이벤트 가 있 습 니 다.어떤 작업 을 완성 할 때 어떤 이벤트 동작 을 보 냅 니 다.예 를 들 어 ContextRefreshedEvent 이 벤트 를 감청 할 때 모든 bean 이 초기 화 되 고 성공 적 으로 불 러 오 면 이 이 벤트 를 촉발 합 니 다.응용 프로그램 Listener 인 터 페 이 스 를 실현 하면 감청 동작 을 받 을 수 있 고 자신의 논 리 를 쓸 수 있 습 니 다.같은 사건 은 사용자 정의,감청 도 가능 하고 사용자 정의 도 가능 하 며 완전히 자신의 업무 논리 에 따라 처리 할 수 있다.그래서 자원 초기 화 로드 도 할 수 있 습 니 다!
    
    @Component
    public class DataSourceInitListener implements ApplicationListener<ContextRefreshedEvent> {//ContextRefreshedEvent     
     
        private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
     
        @Autowired
        private SystemConfigService systemConfigService;
        @Autowired
        private ItemService itemService;
        @Autowired
        private SystemResultService systemResultService;
     
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            if(event.getApplicationContext().getParent() == null) {//       ,        
                LOGGER.info("   systemConfig  ");
                systemConfigService.initConfig();
                LOGGER.info("         ");
                systemResultService.initResult();
                LOGGER.info("       ...........");
            }
        }
     
    }
    여기 서 SpringBoot 자원 초기 화 로 딩 에 관 한 몇 가지 방법 에 관 한 글 을 소개 합 니 다.더 많은 SpringBoot 자원 초기 화 로 딩 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기