我们可以计算Spring bean初始化时间

我想开发一个弹簧AOPfunction,我们可以在spring bean初始化期间放置一个切入点/内部,以便根据业务需要计算一些统计数据。 我想知道它是否可以使用弹簧AOP模块?

您可以使用此组件测量初始化时间:

@Component public class MyBeanPostProcessor implements BeanPostProcessor, Ordered { private Map start; private Map 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:

 @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是spring刚刚读完配置(例如,xml文件)并准备创建bean的时刻。

因此,可以使用以下两个组件计算完整的初始化时间,例如:max(end) – launchTime。 (读取最后一个bean的时间与bean配置之间的差异)