原文轉自:http://blog.csdn.net/shaozheng1006/article/details/6916940
<三>
initializingBean接口是spring提供的,子類要實現afterPropertiesSet()方法,init-method是用戶可以通過屬性文件配置的。從這里可以看出實現initializingBean接口是要和spring耦合的,而init-method則不會。但afterPropertiesSet()方法spring可以直接調用執行,init-method指定的方法卻需要通過反射來執行,從效率來上講沒有afgerPropertiesSet()快。InitializingBean和init-method可以一起使用,Spring會先處理InitializingBean再處理init-method。
下面是一個小例子,initializingBean接口和init-method都實現了,可以自己隨便改。
試驗用的bean:
package researchspring.beanfactory;
import org.springframework.beans.factory.InitializingBean;
public class LifeCycleBean implements InitializingBean{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void afterPropertiesSet() throws Exception {
System.out.println("Implements initializing start.....");
if(name == null)
System.out.println("configuration failed!");
System.out.println("Implements initializing end!");
}
public void init() {
System.out.println("init() initializing start.....");
if(name == null)
System.out.println("configuration failed!");
System.out.println("init() initializing end!");
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="lifeBean" class="researchspring.beanfactory.LifeCycleBean"
init-method="init" >
<property name="name" value="apple"></property>
</bean>
</beans>
測試類:
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
LifeCycleBean lifeBean = (LifeCycleBean)ac.getBean("lifeBean");
}
}
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
另外,從網上找了這么一段
下面是一個小例子,initializingBean接口和init-method都實現了,可以自己隨便改。
試驗用的bean:
package researchspring.beanfactory;
import org.springframework.beans.factory.InitializingBean;
public class LifeCycleBean implements InitializingBean{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void afterPropertiesSet() throws Exception {
System.out.println("Implements initializing start.....");
if(name == null)
System.out.println("configuration failed!");
System.out.println("Implements initializing end!");
}
public void init() {
System.out.println("init() initializing start.....");
if(name == null)
System.out.println("configuration failed!");
System.out.println("init() initializing end!");
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="lifeBean" class="researchspring.beanfactory.LifeCycleBean"
init-method="init" >
<property name="name" value="apple"></property>
</bean>
</beans>
測試類:
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
LifeCycleBean lifeBean = (LifeCycleBean)ac.getBean("lifeBean");
}
}
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
另外,從網上找了這么一段
org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory完成一個Bean初始化方法的調用工作。 AbstractAutowireCapableBeanFactory是XmlBeanFactory的超類,再 AbstractAutowireCapableBeanFactory的invokeInitMethods方法中實現調用一個Bean初始化方法:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java:
//……
//在一個bean的合作者設備完成后,執行一個bean的初始化方法。
protected void 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-method
if(mergedBeanDefinition!=null&&mergedBeanDefinition.getInitMethodName() != null) {
//調用invokeCustomInitMethod方法來執行init-method定義的方法
invokeCustomInitMethod(beanName, bean, mergedBeanDefinition.getInitMethodName());
}
}
//執行一個bean定義的init-method方法
protected void 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) {
throw new NoSuchMethodException(
"Couldn't find an init method named '" + initMethodName + "' on bean with name '" + beanName + "'");
}
//判斷方法是否是public
if (!Modifier.isPublic(initMethod.getModifiers())) {
//設置accessible為true,可以訪問private方法。
initMethod.setAccessible(true);
}
try {
//反射執行這個方法
initMethod.invoke(bean, (Object[]) null);
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}
//………..
