我们可以计算 Spring bean 初始化时间吗
Can we calculate Spring bean initialization time
我想开发一个spring AOP 特性,我们可以在spring bean 初始化时放置一个点cut/within,以便根据业务需要计算一些统计数据。
我想知道是否可以使用 spring AOP 模块?
您可以使用此组件测量初始化时间:
@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 定义之后记下片刻。为它使用 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配置的时间差)
我想开发一个spring AOP 特性,我们可以在spring bean 初始化时放置一个点cut/within,以便根据业务需要计算一些统计数据。 我想知道是否可以使用 spring AOP 模块?
您可以使用此组件测量初始化时间:
@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 定义之后记下片刻。为它使用 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配置的时间差)