xml文件如下
<bean class="com.itheima.beanFactory.MyBeanFactoryPostProcessor"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService2" class="com.itheima.service.impl.UserServiceImpl"/>
代码如下
测试代码
public class ApplicationContextTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(applicationContext.getBean("userDao"));
System.out.println(applicationContext.getBean("userService"));
System.out.println(applicationContext.getBean("userService2"));
applicationContext.close();
}
}
BeanFactoryPostProcessor代码
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("修改userDao为userService");
BeanDefinition user = configurableListableBeanFactory.getBeanDefinition("userDao");
user.setBeanClassName("com.itheima.service.impl.UserServiceImpl");
}
}
参考图片
以上代码执行过程:
1.spring获取到BeanDefinition
,将内容封装到BeanDefinitionMap
中。
此时的userDao
的实现是userDaoImpl
此时userService
的实现是userServiceImpl
2.执行MyBeanFactoryPostProcessor的代码,将userDao的BeanDefinition修改,则BeanDefinitionMap中的内容也被修改。
此时的userDao
的实现是userServiceImpl
此时userService
的实现是userServiceImpl
3.spring创建实例
spring创建实例到singletonObjects。
此时userDao,userService,userService2,三者的实现都是userServiceImpl。
输出结果
如下所示: