Spring 源码中的观察者模式学习

270 阅读3分钟

在Spring Bean的生命周期管理中,观察者模式的具体代码如下所示(简化版本):

// 定义观察者接口
public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName);
    Object postProcessAfterInitialization(Object bean, String beanName);
}

// 定义主题接口
public interface BeanFactory {
    void registerBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    Object getBean(String name);
}

// 具体主题
public class DefaultListableBeanFactory implements BeanFactory {
    private List<BeanPostProcessor> beanPostProcessors = new ArrayList<>();

    public void registerBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
        beanPostProcessors.add(beanPostProcessor);
    }

    public Object getBean(String name) {
        // 创建Bean实例

        // 初始化前的处理
        for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
            beanPostProcessor.postProcessBeforeInitialization(bean, name);
        }

        // 初始化Bean

        // 初始化后的处理
        for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
            beanPostProcessor.postProcessAfterInitialization(bean, name);
        }

        return bean;
    }
}

// 具体观察者
public class CustomBeanPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 在初始化之前进行处理
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) {
        // 在初始化之后进行处理
        return bean;
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        BeanPostProcessor beanPostProcessor = new CustomBeanPostProcessor();
        beanFactory.registerBeanPostProcessor(beanPostProcessor);

        Object bean = beanFactory.getBean("beanName");
    }
}

在上述示例中,BeanPostProcessor接口是观察者接口,定义了在Bean初始化前后执行的回调方法。BeanFactory接口是主题接口,定义了注册观察者和获取Bean的方法。DefaultListableBeanFactory是具体主题,实现了BeanFactory接口,负责管理观察者列表,并在适当的时机触发回调方法。

CustomBeanPostProcessor是具体观察者,实现了BeanPostProcessor接口,具体实现了在Bean初始化前后的处理逻辑。

在使用示例中,创建了DefaultListableBeanFactory对象并注册了CustomBeanPostProcessor作为观察者。当调用getBean方法获取Bean时,DefaultListableBeanFactory会依次触发注册的观察者的回调方法,实现了对Bean初始化前后的处理。

这段简化的代码展示了Spring中观察者模式在Bean的生命周期管理中的应用。通过观察者模式,Spring实现了在Bean初始化过程中的可扩展处理,可以自定义一些处理逻辑,例如修改Bean的属性值、增加一些切面逻辑等。

在上述代码中,体现了观察者模式的角色和调用顺序如下:

  1. 主题(Subject)角色:

    • DefaultListableBeanFactory类充当主题角色,实现了BeanFactory接口。
    • 主题角色负责管理观察者列表,即beanPostProcessors字段。
    • 主题角色提供注册观察者的方法registerBeanPostProcessor
  2. 观察者(Observer)角色:

    • CustomBeanPostProcessor类充当观察者角色,实现了BeanPostProcessor接口。
    • 观察者角色定义了在Bean初始化前后执行的回调方法postProcessBeforeInitializationpostProcessAfterInitialization
  3. 调用顺序:

    • Main类的main方法中,首先创建了DefaultListableBeanFactory对象作为主题角色。
    • 然后创建了CustomBeanPostProcessor对象作为观察者角色。
    • 调用beanFactory.registerBeanPostProcessor(beanPostProcessor)将观察者注册到主题中。
    • 最后调用beanFactory.getBean("beanName")方法获取Bean,触发了主题的操作。

    调用顺序如下:

    1. getBean方法内部调用了postProcessBeforeInitialization方法,执行了观察者的初始化前处理逻辑。
    2. Bean的初始化过程。
    3. getBean方法内部调用了postProcessAfterInitialization方法,执行了观察者的初始化后处理逻辑。

在整个调用过程中,主题(DefaultListableBeanFactory)充当了观察者模式中的"主题"角色,而观察者(CustomBeanPostProcessor)充当了观察者模式中的"观察者"角色。观察者被注册到主题中,并在特定的时机(初始化前后)被调用。这种触发机制使得观察者能够对主题的状态进行观察并作出相应的响应。