Spring容器初始化完之后执行某个方法
来源:互联网 发布:弱电编程语言 编辑:程序博客网 时间:2024/06/08 06:32
<一>
InitializingBean
<三>
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-methodif(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 + "'");}//判断方法是否是publicif (!Modifier.isPublic(initMethod.getModifiers())) {//设置accessible为true,可以访问private方法。 initMethod.setAccessible(true);}try {//反射执行这个方法initMethod.invoke(bean, (Object[]) null);}catch (InvocationTargetException ex) {throw ex.getTargetException();}}//………..
0 0
- Spring容器初始化完之后执行某个方法
- 最佳实践--Spring容器初始化完成之后执行某个方法
- 最佳实践--Spring容器初始化完成之后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 当spring 容器初始化完成后执行某个方法
- 6a828下android5.0下usb触摸屏SHOW_TOUCHES有轨迹会导致多次点击或双点系统没反应
- ORACLE关于锁和V$LOCK的分析
- sql 加强
- 进程间通信之:socket
- 什么是算法
- Spring容器初始化完之后执行某个方法
- 编译出现C compiler cannot create executables
- logback学习
- android6.0系统Healthd深入分析
- 国际化文件中如何使用空格
- 数据库连接池的作用与基本原理
- iptables的备份、恢复及防火墙脚本的基本使用
- Ansible Ad-Hoc命令
- 栈