美文网首页
Spring与设计模式

Spring与设计模式

作者: 幸运猪x | 来源:发表于2019-06-25 11:59 被阅读0次

    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结合,
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          // ...
        </bean>
        
      • 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与设计模式

          本文链接:https://www.haomeiwen.com/subject/diftcctx.html