복붙노트

[SPRING] 스프링 빈 초기화 시간을 계산할 수 있습니까?

SPRING

스프링 빈 초기화 시간을 계산할 수 있습니까?

스프링 빈 초기화 중에 포인트 컷 / 인을 넣어 비즈니스에 필요한 일부 통계를 계산할 수있는 스프링 AOP 기능을 개발하고 싶습니다. 스프링 AOP 모듈을 사용하여 가능한지 알고 싶습니다.

해결법

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

    1.이 구성 요소를 사용하여 초기화 시간을 측정 할 수 있습니다.

    이 구성 요소를 사용하여 초기화 시간을 측정 할 수 있습니다.

    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
    
        private Map<String, Long> start;
    
        private Map<String, Long> end;
    
        public MyBeanPostProcessor() {
            start = new HashMap<>();
            end = new HashMap<>();
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            start.put(beanName, System.currentTimeMillis());
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            end.put(beanName, System.currentTimeMillis());
            return bean;
        }
    
        @Override
        public int getOrder() {
            return Integer.MAX_VALUE;
        }
    
        //this method returns initialization time of the bean.
        public long initializationTime(String beanName) {
           return end.get(beanName) - start.get(beanName);
        }
    }
    

    그러나 이번에는 생성자를 실행하는 시간은 포함되지 않습니다.

    그러나 모든 bean 생성자를 실행하기 전에 bean 정의를 읽은 후 잠시 기록을 남길 수 있습니다. BeanFactoryPostProcessor를 사용하십시오.

    @Component
    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
        private long launchTime;
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
            launchTime = System.currentTimeMillis();
        }
    
        public long getLaunchTime() {
            return launchTime;
        }
    }
    

    lauchTime은 스프링이 구성 (예 : xml 파일) 읽기를 마치고 Bean을 작성할 준비가 된 순간입니다.

    따라서 전체 초기화 시간은 max (end)-launchTime과 같은 두 가지 구성 요소를 사용하여 계산할 수 있습니다. (마지막 Bean이 초기화 된 시간과 Bean 구성을 읽은 시간의 차이)

  2. from https://stackoverflow.com/questions/38701285/can-we-calculate-spring-bean-initialization-time by cc-by-sa and MIT license