【Spring系列】- 手写模拟Spring框架( 五 )

初始化在spring容器中,不只是完成bean对象的创建,还需要能够对bean进行初始化 。需要创建InitializingBean接口类 。
public interface InitializingBean {    public void afterPropertiesSet();}在需要进行初始化的bean对象去实现这个接口的方法 , 这里main可以进行一些操作 。在createBean中 , 会根据判断是否有InitializingBean类,会在实例化之后调用这个方法进行初始化 。
// 5 初始化if (instance instanceof InitializingBean) {    ((InitializingBean)instance).afterPropertiesSet();}结果

【Spring系列】- 手写模拟Spring框架

文章插图
BeanPostProcessorBeanPostProcessor可以对spring中bean的创建去做一些操作 。
BeanPostProcessor接口在spring中定义一个BeanPostProcessor接口,里面会有初始化前后操作的方法,并且将beanName和bean对象带入进行自定义的操作 。
public interface BeanPostProcessor {    public Object postBeforeProcessor(String beanName, Object bean); // 初始化前    public Object postAfterProcessor(String beanName, Object bean); // 初始化后}自定义BeanPostProcessor这里可以定义自己的类去实现spring中的BeanPostProcessor,对初始化进行一些相应操作 。并且能够根据某个bean对象来做不同的操作 。原理就是将MyBeanPostProcessor注入到容器中,在扫描的时候将这个对象保存起来,在创建bean的时候去遍历BeanPostProcessor集合,在去调用这个实例的方法 。
@Component // 需要注入springpublic class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postBeforeProcessor(String beanName, Object bean) {        System.out.println("初始化前的bean:" + beanName + " -- " + bean);        return bean;    }    @Override    public Object postAfterProcessor(String beanName, Object bean) {        System.out.println("初始化后的bean:" + beanName + " -- " + bean);        return bean;    }}然而 , 在spring扫描的时候会进行操作,因为自己实现的BeanPostProcessor是通过Component注解注入spring容器的 。因此可以通过判断有Component注解时候,进行判断是否含有BeanPostProcessor类 , 如果有生成BeanPostProcessor对象,并且将其实例添加到beanPostProcessorList容器中 。在此就需要定义ArrayList<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();来记录BeanPostProcessor 。
// 6 判断是否是并加入beanPostProcessorList,这里不能使用instanceofif (BeanPostProcessor.class.isAssignableFrom(clazz)) {    // 直接生成对象    BeanPostProcessor instance = (BeanPostProcessor) clazz.newInstance();    // 然后保存进去    beanPostProcessorList.add(instance);}接着就可以在创建bean对象的时候,在初始化前后去遍历这个BeanPostProcessor链表,调用相应的方法,就能够调用自定义的MyBeanPostProcessor的方法 。
// 6 BeanPostProcessor 初始化前 AOP 遍历beanPostProcessorListfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {    instance = beanPostProcessor.postBeforeProcessor(beanName, instance);}// 5 初始化if (instance instanceof InitializingBean) {    ((InitializingBean)instance).afterPropertiesSet();}// 6 BeanPostProcessor 初始化后 AOPfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {    instance = beanPostProcessor.postAfterProcessor(beanName, instance);}运行结果:.
【Spring系列】- 手写模拟Spring框架

文章插图
AOP机制需要通过代理对象 。这样如果不进行操作,返回的对象还是原来的 , 如果是通过操作了,那么返回的就是代理的对象 。这里就简单的打印一句话 。在扫描的时候,扫到userService这个bean的时候,返回的实例就是代理对象 。

推荐阅读