ApplicationContext接口生命周期

/ Spring / 没有评论 / 311浏览

今天我们看一下ApplicationContext接口的生命周期,在其它文章中本人已经分享了BeanFactory接口的生命周期,所以这在一篇中我们的重点是分享一下这两个接口的区别。虽然这两个接口的生命周期相类似,但它们还是有一些区别的。主要的区别如下:

下面我们将用测试用例来验证ApplicationContext接口会不会自动将上述接口注册到上下文中。

public class User {

private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
public class MarkBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("user");
beanDefinition.getPropertyValues().addPropertyValue("password", "jilinwula");
System.out.println("BeanFactoryPostProcessor.postProcessBeanFactory");
}
}
<bean id="user" class="com.jilinwula.spring.User" p:username="admin"/>
<bean class="com.jilinwula.spring.MarkBeanFactoryPostProcessor"/>
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
BeanFactoryPostProcessor.postProcessBeanFactory
User{username='admin', password='jilinwula'}

上述结果我们已经看到了,我们的实例类Car中没有实现任何接口,完全由spring自已自动注入的MarkBeanFactoryPostProcessor接口,并已经将实体类Car的password属性修改了。下面我们将用同样的代码,但用BeanFactory接口的方式启动IOC容器看来一下程序的执行输出。

@Test
public void test() {
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml"));
User user = beanFactory.getBean("user", User.class);
System.out.println(user);
}
User{username='admin', password='null'}

我们看BeanFactory接口并不会自动的将MarkBeanFactoryPostProcessor接口注册到应用上下文中,所以上述结果中的实体类Car中的pasword属性为空。这也就是在其它文章中我们说过的,ApplicationContext接口为是为我们使用spring框架的人使用,所以这个接口做了很多我们日常开发时所需要的功能。所以在日常开发时,我们推荐使用ApplicationContext接口处理业务。