修改类:
测试类:
1、实现BeanFactoryPostProcess接口,重写postProcessBeanFactory方法,此时方法入参即可拿到spring的beanFactory
2、根据bean工厂,获取bendDefinition
3、修改beanDefinition
4、测试,此时执行代码会发现报错,原因是找不到beanName为car的bean对象。因为在修改beanDefinition中已经修改了。
补充一下Bean的生命周期:
Bean的加载过程(生命周期):
1、加载BeanDefinition配置元信息:通过各种BeanDefinitionReader(如:XmlBeanDefinitionReader,PropertiesBeanDefinitionReader等)读取配置文件,再通过BeanDefinitionScanner去进行筛选需要创建bean的类或者xml,之后通过BeanDefinitionRegistry转换成内存形式的BeanDefinition,放在一个map中 ;
2、可以通过后置增强器BeanFactoryPostProcessor修改BeanDefinition中数据
3、将BeanDefinition加载至BeanFactory中(简单工厂模式),通过getBean();方法进行创建bean
4、推断构造器,进行实例化对象(即:在堆中开辟一块内存空间,并给属性值设置默认值)
5、填充属性,包括依赖注入
6、回调执行Aware接口需要实现的方法,想要设置什么bean对象在spring ioc容易中的属性名,就在对应类上实现什么类型接口,比如:BeanNameAware,修改 beanName
7、执行初始化前置操作,增强器,BeanPostProcessor:before,实际是在对应类中,执行加上了@PostConstruct注解的方法
8、检查类是否实现InitializingBean以决定是否调用afterPropertiesSet方法(类实现接口:initializingBean,重写方法:afterPropertiesSet)
9、检查类是否配置有自定义的init-method方法,执行初始化方法,init-method方法
10、执行初始化后置操作,BeanPostProcessor:after
11、创建完整bean,如果作用域是单例,还会将该bean放入单例池,即:一个ConcurretnHashMap类型的Map<beanName,bean对象> map,其他地方使用,直接先查,不存在的情况下才会创建bean对象(三级缓存了解下)
12、使用
13、销毁bean对象:调用disposableBean中destory方法