2016-08-01 85 views
0

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

+0

你想计算Spring bean获取初始化时间或业务逻辑执行时间的时间段吗? –

+0

hello..i想要计算Spring bean获取初始化时间。使用这段时间我们需要计算一些商业标准 –

+0

只是好奇什么样的业务标准依赖于spring初始化时间? init方法中是否存在需要更多时间的逻辑,并且需要记录这些逻辑? –

回答

2

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

@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文件),并准备创建豆。

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

相关问题