spring的InitializingBean的 afterPropertiesSet 方法 和 init-method配置的 區別聯絡
阿新 • • 發佈:2019-02-12
//……//在一個bean的合作者裝置完成後,執行一個bean的初始化方法。protectedvoid invokeInitMethods(String beanName, Object bean, RootBeanDefinition mergedBeanDefinition) throws Throwable {
//判斷bean是否實現了InitializingBean介面if (bean instanceof InitializingBean) {if (logger.isDebugEnabled()) {logger.debug("Invoking afterPropertiesSet() on bean with name '"+ beanName +"'");}
// 呼叫afterPropertiesSet方法((InitializingBean) bean).afterPropertiesSet();}
//判斷bean是否定義了init-methodif(mergedBeanDefinition!=null&&mergedBeanDefinition.getInitMethodName() !=null) {//呼叫invokeCustomInitMethod方法來執行init-method定義的方法invokeCustomInitMethod(beanName, bean, mergedBeanDefinition.getInitMethodName());}
}
// 執行一個bean定義的init-method方法protectedvoid invokeCustomInitMethod(String beanName, Object bean, String initMethodName)throws Throwable {
if (logger.isDebugEnabled()) {logger.debug("Invoking custom init method '"+ initMethodName +"' on bean with name '"+ beanName +"'");}
//使用方法名,反射Method物件Method initMethod = BeanUtils.findMethod(bean.getClass(), initMethodName, null );if (initMethod ==null) {thrownew NoSuchMethodException("Couldn't find an init method named '"+ initMethodName +"' on bean with name '"+ beanName +"'");}
//判斷方法是否是publicif (!Modifier.isPublic(initMethod.getModifiers())) {//設定accessible為true,可以訪問private方法。 initMethod.setAccessible(true);}
try {//反射執行這個方法initMethod.invoke(bean, (Object[]) null);}
catch (InvocationTargetException ex) {throw ex.getTargetException();}
}
//………..