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

Aware回调机制与初始化Aware回调那如果我们需要获取当前bean的名字呢?那就得通过Aware回调机制 。我们需要创建一个BeanNameAware接口,里面提供一个setBeanName方法 。
public interface BeanNameAware {    public void setBeanName(String beanName);}在createBean方法中去编写回调机制,通过判断这个实例是否有BeanNameAware这个类,通过setName方法间接传递了beanName 。
// 4 Aware回调机制if (instance instanceof BeanNameAware) {    ((BeanNameAware)instance).setBeanName(beanName);}在UserService方法中去实现这个BeanNameAware方法,这就能够在UserService里的beanName字段中得到这个bean对象的真实的beanName了 。
@Component("userService") // 注入spring@Scope("property")public class UserService implements BeanNameAware, InitializingBean {    @Autowired    private RoleService roleService; // 依赖注入,加上@Autowired注解    private String beanName;    @Override    public void setBeanName(String beanName) {        this.beanName = beanName;    }    public void test() {        System.out.println("RoleService: " + roleService);    }    @Override    public void afterPropertiesSet() {        // ......        System.out.println("初始化");    }}初始化在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对象带入进行自定义的操作 。
【【Spring系列】- 手写模拟Spring框架】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;    }}

经验总结扩展阅读