Spring这个框架断断续续用了几年,但是很多其中的机制并没有完全理解透彻,现在抽出时间系统整理一下相关知识点,也是为自己的技术进行总结!
InitailizingBean
- 这个接口 InitailizingBean中只有一个方法,就是afterPropertiesSet。该方法是指Spring容器在启动后主动调用该接口的方法。
- 如果一个Bean实现了InitializingBean,则该方法会在容器实例化该Bean,初始化Bean的属性完毕之后,再调用afterPropertiesSet方法。
- afterPropertiesSet通过方法名称即可知道含义:在bean的属性设置完毕后调用该方法。
- 接口InitializingBean接口源码如下:
public interface InitializingBean {
/**
* 当Bean的属性被设置完毕后,由BeanFactory调用该方法。
* 该方法允许bean的实例去执行一些初始化动作,当所有的bean属性完成设置之后执 *行。
*/
void afterPropertiesSet() throws Exception;
}
ApplicationContextWare
- 看名称带Aware,就可以知道这个接口由Spring容器主动通知调用。Spring容器在通知该接口的实现类时,会将上下文ApplicationContext注入进来。
- 改接口中就一个方法:
- void setApplicationContext(ApplicationContext applicationContext) throws BeansException
- 即容器启动后,将ApplicationContext 注入到该方法中。
实例代码示例
public class AccountServiceContext implements ApplicationContextAware,InitializingBean,DisposableBean {
private transient ApplicationContext applicationContext;
private String serviceName;
public AccountServiceContext(){
System.out.println("constructor execute! ");
}
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
System.out.println("Spring容器主动调用ApplicationContextAwar接口,将ApplicationContext加载 : "+applicationContext);
}
public void afterPropertiesSet() throws Exception {
System.out.println("*****afterPropertiesSet method execute!*****");
System.out.println("属性值是 : "+this.getServiceName());
this.setServiceName("初始化数据库连接");
}
public void destroy() throws Exception {
System.out.println("*****destroy method execute!*****");
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
- 配置文件如下:
<bean id="accountServiceContext" class="com.egfbank.spring.AccountServiceContext" >
<property name="serviceName" value="initialService"/>
</bean>
- 测试代码如下:
public class SpringEventAwareContextTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:/config/spring-event-study.xml");
context.start();
AccountServiceContext service = context.getBean(AccountServiceContext.class);
System.out.println(service.getServiceName());
}
}
- 执行结果如下: