Spring与设计模式

1. 简单工厂模式

  • 实现:BeanFactory接口
    如图,BeanFactory是Spring中最底层的接口之一,它提供了Spring IoC的最底层设计:
    BeanFactory.png

    BeanFactory的结构.png

    其中getBean方法实现了简单工厂模式:将参数传递给工厂类,动态决定应该创建哪一个产品类。通过getBean(bean.class)获得对应的bean实例。
  • 原理:
    • Bean容器启动阶段:
      • 读取Bean的XML文件,将bean元素转换为BeanDefinition对象。
      • 然后通过BeanDefinitionRegistry将这些bean注册到BeanFactory中,将它们保存在一个ConcurrentHashMap中。
    • 容器中bean的实例化阶段,主要是通过反射、cglib对bean进行实例化。

2. 工厂方法

  • 实现:FactoryBean接口
    FactoryBean的结构.png
  • 特点:实现了FactoryBean接口的bean是一类叫做factory的bean。
    spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,因此返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。
  • 例子:
    • 典型的例子就是Spring与Mybatis结合,
      
        // ...
      
      
    • SqlSessionFactoryBean解析:
      // getObject返回了一个SqlSessionFactory实例
      public SqlSessionFactory getObject() throws Exception {
          if (this.sqlSessionFactory == null) {
              this.afterPropertiesSet();
          }
          return this.sqlSessionFactory;
      }
      // 并且当this.sqlSessionFactory为null时,会进行断言检验,然后创建一个SqlSessionFactory实例
      public void afterPropertiesSet() throws Exception {
          Assert.notNull(this.dataSource, "Property 'dataSource' is required");
          Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
          Assert.state(this.configuration == null && this.configLocation == null || this.configuration == null || this.configLocation == null, "Property 'configuration' and 'configLocation' can not specified with together");
          this.sqlSessionFactory = this.buildSqlSessionFactory();
      }
      

3. 代理模式

  • 实现:Spring AOP的底层原理就是通过代理模式实现的。
    • 静态代理:代理类实现与目标对象相同的接口,并在内部维护一个代理对象。
    • 动态代理:动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),利用JDK的API生成指定接口的对象,也称为JDK代理。
    • cglib代理:通过引入cglib的jar包,实现MethodInterceptor接口,实现代理。

未完待续

你可能感兴趣的:(Spring与设计模式)