当前位置: 首页 > 面试题库 >

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

方宏富
2023-03-14
问题内容

我想开发一个spring AOP功能,我们可以在spring
bean初始化期间放置一个切入点/切入点,以便根据业务需要计算一些统计信息。我想知道是否可以使用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是弹簧刚完成读取配置(例如xml文件)并准备创建bean的时刻。

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



 类似资料:
  • 我想开发一个Spring AOP特性,在这个特性中,我们可以在Spring bean初始化期间将一个点切入/放入其中,以便根据业务需要计算一些统计信息。我想知道是否可以使用SpringAOP模块?

  • 问题内容: 编译失败(出现错误),正如人们期望的那样: 但这有效: 这是怎么回事?在后一种情况下分配什么? 问题答案: 摘要:两个初始化程序都访问一个尚未初始化的字段(因此,其默认值为零)。由于这很可能是编程错误,因此该语言禁止了这种访问的某些简单形式。但是,它不禁止使用更复杂的形式。 该行为符合JLS,特别是第8.3.2.3节。初始化期间对字段的使用限制 只有在成员声明是类或接口的实例字段(分别

  • 我正在开发我的第一个 Swing 应用程序,现在提出了一个难题:在静态初始化期间或开始实际执行后执行引导和资源初始化。我是什么意思...我有单例: 因此,方法如下所示 或者,也许我在启动后手动初始化资源,然后运行它。逻辑上正确的方式是什么?

  • 问题内容: TensorFlow中初始化变量的标准方法是 经过一段时间的学习后,我创建了一组新变量,但是一旦初始化它们,它将重置所有现有变量。目前,解决此问题的方法是保存所需的所有变量,然后在tf.initalize_all_variables调用之后重新应用它们。这有效,但是有点笨拙。我在文档中找不到像这样的东西… 有谁知道初始化未初始化变量的好方法吗? 问题答案: 没有优雅的方法可以枚举图中的

  • 我正在使用mockito作为junit。在创建对象的模拟时,我有疑问。我有一个名为DBConnect的类。我需要数据库属性,如dbname、凭据等。PatientDetails使用这个类。现在,当我为PatientDetails编写junit时。所以我使用以下代码。 用这个我不能得到正确的结果。

  • 问题内容: 我们如何在对象创建时初始化类的最终变量? 任何人都可以解释它怎么可能?… 问题答案: 您必须一次且仅一次初始化最终变量。有三种方法可以对实例变量执行此操作: 在构造函数中 在实例初始化块中。 当你声明它 这是这三个示例: 在每种情况下,代码在您调用时都运行一次,并且无法再次调用其中的任何一个,这满足了初始化要求每个实例仅执行一次的要求。