Spring 中用到的设计模式

工厂方法

工厂方法定义:父类定义了创建对象的接口,但是由子类来具体实现,工厂方法让类把实例化的动作推迟到了子类当中。

例如实现了 FactoryBean 接口的类,Spring 可以利用 getObject() 方法返回实现了该接口的类的实例;

AbstractFactoryBean 实现了 FactoryBean 接口,由子类去实现 createInstance 的逻辑

  1. public abstract class AbstractFactoryBean<T>
  2. implements FactoryBean<T>, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {
  3. @Override
  4. public final T getObject() throws Exception {
  5. if (isSingleton()) {
  6. return (this.initialized ? this.singletonInstance : getEarlySingletonInstance());
  7. }
  8. else {
  9. return createInstance();
  10. }
  11. }
  12. protected abstract T createInstance() throws Exception;
  13. }

单例模式

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

AbstractBeanFactory 提供 getBean 方法,具体调用到 DefaultSingletonBeanRegistry.getSingleton 方法中,使用 Double Check 方式获取单例 Bean

  1. public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
  2. @Nullable
  3. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  4. Object singletonObject = this.singletonObjects.get(beanName);
  5. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  6. synchronized (this.singletonObjects) {
  7. singletonObject = this.earlySingletonObjects.get(beanName);
  8. if (singletonObject == null && allowEarlyReference) {
  9. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  10. if (singletonFactory != null) {
  11. singletonObject = singletonFactory.getObject();
  12. this.earlySingletonObjects.put(beanName, singletonObject);
  13. this.singletonFactories.remove(beanName);
  14. }
  15. }
  16. }
  17. }
  18. return singletonObject;
  19. }
  20. }

代理模式

AOP 的实现

  • 静态代理,编写代理类,通过代理类操作被代理的对象
  • 动态代理,利用反射、修改字节码的方式生成代理类

观察者模式

实现 ApplicationListener 接口,就可以接收对应的事件消息

  1. @FunctionalInterface
  2. public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
  3. void onApplicationEvent(E var1);
  4. }

策略模式

通过实现 Resource 接口,提供更强的资源访问能力。

UrlResource、ClassPathResource、FileSystemResource 等等

模板方法模式

模板方法模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

AbstractApplicationContext 中的 refresh 方法,里面调用的一系列方法,其中 postProcessBeanFactory,onRefresh 的实现由子类去实现

  1. public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
  2. public void refresh() throws BeansException, IllegalStateException {
  3. synchronized(this.startupShutdownMonitor) {
  4. this.prepareRefresh();
  5. ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
  6. this.prepareBeanFactory(beanFactory);
  7. try {
  8. this.postProcessBeanFactory(beanFactory);
  9. this.invokeBeanFactoryPostProcessors(beanFactory);
  10. this.registerBeanPostProcessors(beanFactory);
  11. this.initMessageSource();
  12. this.initApplicationEventMulticaster();
  13. this.onRefresh();
  14. this.registerListeners();
  15. this.finishBeanFactoryInitialization(beanFactory);
  16. this.finishRefresh();
  17. } catch (BeansException var9) {
  18. if (this.logger.isWarnEnabled()) {
  19. this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
  20. }
  21. this.destroyBeans();
  22. this.cancelRefresh(var9);
  23. throw var9;
  24. } finally {
  25. this.resetCommonCaches();
  26. }
  27. }
  28. }

适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口

Spring MVC 中的 HandlerAdapter

  1. public interface HandlerAdapter {
  2. boolean supports(Object var1);
  3. @Nullable
  4. ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
  5. long getLastModified(HttpServletRequest var1, Object var2);
  6. }

装饰器模式

装饰器模式:动态地给对象添加额外的功能

Spring 中用到的包装器模式在类名上有两种表现: 一种是类名中含有 Wrapper, 另一种是类名中含有 Decorator。