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);
}
posted @ 2021-10-29 16:44  rainbring  阅读(52)  评论(0)    收藏  举报