Spring源码简易手写实现(学习过程记录)(五)
5.1 BeanPostProcessor接口
beanPostProcessor接口可以用于在createBean中,初始化前和初始化后对bean进行进一步操作
package com.rainwood.spring;
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName);
Object postProcessAfterInitialization(Object bean, String beanName);
}
定义一个它的实现类limingBeanPostProcessor
package com.rainwood.liming.service;
import com.rainwood.spring.BeanPostProcessor;
import com.rainwood.spring.Component;
@Component
public class limingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("初始化前");
if(beanName.equals("userService")) {
((UserService)bean).setName("西电");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("初始化后");
return bean;
}
}
在初始化前,我们调用了实例化UserService后的bean的setName方法,然后再将bean返回
package com.rainwood.liming.service;
import com.rainwood.spring.*;
@Component("userService")
//@Scope("prototype")
public class UserService implements BeanNameAware, InitializingBean {
@Autowired
private OrderService orderService;
private String beanName;
private String name;
public void setName(String name) {
this.name = name;
}
public void test() {
System.out.println(orderService);
System.out.println(beanName);
System.out.println(name);
}
@Override
public void setBeanName(String name) {
beanName = name;
}
//初始化时候调用这个方法想做啥就做啥
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
}
而且limingBeanPostProcessor上有Component注解,将该对象注入到bean容器中
//判断当前这个扫描到的类是不是实现了BeanPostProcessor
if(BeanPostProcessor.class.isAssignableFrom(aClass)) {
BeanPostProcessor instance = (BeanPostProcessor) aClass.getDeclaredConstructor().newInstance();
beanPostProcessorList.add(instance);
}
判断了扫描到的class是不是BeanPostProcessor,如果是的话就直接实例化,并且将实例化的bean放入到beanPostProcessorList中
private List<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();
5.2 createBean时初始化前初始化后调用
//在初始化之前对bean进行的操作,调用实例化过的beanPostProcessor的postProcessBeforeInitialization方法
for (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {
instance = beanPostProcessor.postProcessBeforeInitialization(instance, beanName);
}
//初始化后
for (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {
instance = beanPostProcessor.postProcessAfterInitialization(instance, beanName);
}
浙公网安备 33010602011771号