【问题标题】:Can we calculate Spring bean initialization time我们可以计算 Spring bean 初始化时间吗
【发布时间】:2016-12-06 16:16:01
【问题描述】:

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

【问题讨论】:

  • 你想计算spring bean的初始化时间还是你的业务逻辑执行时间?
  • 你好..我想计算spring bean得到初始化时间。使用那个时间我们需要计算一些业务标准
  • 只是好奇什么样的业务标准取决于弹簧初始化时间? init 方法中是否有一些需要更多时间的逻辑,您需要记录这些逻辑吗?
  • 基本上它可以帮助我们解决代码性能问题

标签: java spring spring-aop


【解决方案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 是 spring 刚刚完成读取配置(例如 xml 文件)并准备创建 bean 的时刻。

因此,可以使用这两个组件来计算完整的初始化时间,例如:max(end) - launchTime。 (上次初始化bean和读取bean配置的时间差)

【讨论】:

  • 酷,但是你如何计算运行构造函数的时间呢? IE。完全初始化的时间?
  • 如果添加 System.out.println(beanName);在 postProcessBeforeInitialization() 中,您会注意到在“之前”和“之后”初始化之间,Spring 构造了与正在测量的 bean 无关的 bean。所以这次你收集的时间不是创建 bean 的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
相关资源
最近更新 更多