当前位置: 首页 > 知识库问答 >
问题:

我们能计算Spring bean初始化时间吗

岳正浩
2023-03-14

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

共有1个答案

琴宾鸿
2023-03-14

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

@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)-启动时间。(上次bean初始化和读取bean配置的时间之间的差异)

 类似资料:
  • 问题内容: 我想开发一个spring AOP功能,我们可以在spring bean初始化期间放置一个切入点/切入点,以便根据业务需要计算一些统计信息。我想知道是否可以使用spring AOP模块? 问题答案: 您可以使用以下组件来测量初始化时间: 但是这次不包括运行构造函数的时间。 但是,您可以在读取所有bean定义之后记录一下,然后运行所有bean构造函数。为此使用BeanFactoryPost

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

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

  • 目前,我想为我的系统创建一个集成测试。我正在使用testcontainers生成我的临时数据库实例,并使用R2DBC数据库使我的系统具有反应性。问题是我不知道如何在R2DBC testcontainer实例中创建模式,在testcontainers网页中R2DBC支持和JDBC支持的文档中有明显的区别。在JDBC中,有一节在我们替换JDBC URL后创建模式,同时在R2DBC中,没有提到在我们替换

  • 问题内容: 我想像这样使用Self in init参数: 我知道我可以在这里使用“ A”,但是我想实现这一点,如果某个类从A继承,那么它的初始化器将知道操作是它的类类型,而不仅仅是A。所以例如,如果我这样写: 然后,我可以使用: 这可能吗? 问题答案: 不必使用或在每个初始化器中使用,您可以简单地重写每个子类的初始化器以使用其自己的类型为。 之所以起作用,是因为的初始值设定项声明的类型应符合,并且

  • 问题内容: 我在Go中有一个函数,如下所示: 我想用参数(“ Bob”,“ New York”,“ Builder”,30、1000)调用此函数,但我想在调用函数时使用字段名称。但是,以下技术均无效(它们会引发“未解决的参考错误”): 应该如何正确完成?我在初始化结构时使用字段名称没有问题,但是对于函数来说,似乎缺少了一些东西。 问题答案: 该规范不允许你调用函数时指定参数名称。您只能列出希望作为