2016-08-01 69 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配置被讀取的時間之間的差異)