您可以使用以下组件来测量初始化时间:
@Componentpublic 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构造函数。为此使用BeanFactoryPostProccessor:
@Componentpublic 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的配置之间的差异)



