Spring使用到的设计模式

Spring涉及到的设计模式

  1. 简单工厂模式
  2. 工厂模式
  3. 单例模式
  4. 适配器
  5. 装饰器模式 Decortor
  6. 代理模式
  7. 观察者模式
  8. 策略模式
  9. 模板模式

 

  1. 简单工厂模式
    • 一个工厂类根据传入的参数,动态决定创建哪一个类
      
      public abstract class AbstractBeanFactory extends ***{
      //根据传入的名字 创建某个类
          @Override
          public Object getBean(String name,……) throws BeansException {
          // doGetBean才是真正向IoC容器获取被管理Bean的过程  
              return doGetBean(name, null, null, false);
          }
      }
      }
      
      
      
  2. 工厂模式
    • 将对象的创建及初始化交给工厂对象
      
      public abstract class AbstractAutowireCapableBeanFactory(){
          
         protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
               // 1.利用工厂模式进行实例化
              if (mbd.getFactoryMethodName() != null)  {
                  return instantiateUsingFactoryMethod(beanName, mbd, args);
              }
              
          根据不同的条件进行实例化
               
      }
      
  3. 单例模式
    • 比如在创建bean的时候。
  4. 适配器
    • aop中生成代理对象前,设置拦截器,通过拦截器中的内容增强了代理方法的功能。
      Adapter类接口:Target
      public interface AdvisorAdapter {
       
      boolean supportsAdvice(Advice advice);
       
            MethodInterceptor getInterceptor(Advisor advisor);
       
      }
      
      MethodBeforeAdviceAdapter类,Adapter
      
      class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
       
            public boolean supportsAdvice(Advice advice) {
                  return (advice instanceof MethodBeforeAdvice);
            }
       
            public MethodInterceptor getInterceptor(Advisor advisor) {
                  MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
            return new MethodBeforeAdviceInterceptor(advice);
            }
       
      }
      
      
  5. 装饰器模式 Decortor
    • 我们的项目需要访问不同的数据库。如何动态的切换不同的数据源呢
      spring用到的包装器模式在类名上有两种表现,一种含有 Wrapper 另一种 Decorator
      基本上都是动态的给一个对象添加些额外的职责
      一种是
      applicationContext中配置所有的dataSource 可能是不同类型的,比如不同的数据库
      
      二是 org.springframework.jndi.JndiObjectFactoryBean
      sessionFactory根据用户的每次请求,将dataSource设成不同的数据源
      
  6. 代理模式

    Spring AOP 利用了 AspectJ AOP实现的! AspectJ AOP 的底层用了动态代理
    动态代理有两种
    目标方法有接口时候自动选用 JDK 动态代理
    目标方法没有接口时候选择 CGLib 动态代理

  7. 观察者模式

    定义对象间的一对多的依赖关系,当一个对象状态发生变化时,所有依赖他的对象都会被通知并更新

    spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
  8. 策略模式
    ApplicationContex接口实现有ClassPathXmlApplicationContext和FileSystemXmlApplicationContext类
    根据beans.xml的文件路径来选择使用哪一个实现方法
    --ClassPathXmlApplicationContext:从类的路径下加载配置文件
    --FileSystemXmlApplicationContext:从文件系统路径下加载文件


     
  9. 模板模式:定义一个操作中算法的框架,实现延伸到子类

    spring中的jdbcTemplate中excute

    Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值