zoukankan      html  css  js  c++  java
  • spring总结

      

      ★IoC:Spring通过控制反转技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。可以认为IoC与JNDI相反——不是我们自己控制对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它,这就是DI——依赖注入。

    依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

    基本上就是对象不用自己动手管理和创建。完全由容器管理,我们只管用就行。

    首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。

      那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。

      

      

      

      0

    spring 中就是应用前两种;但又不仅仅是初始化实例,而且是运用接口的概念去实现这种注入依赖。静态地看,只是依赖一个接口,但实际运行起来,是依赖一个实现了该 接口的具体类。

    IOC就是面向接口编程的应用?

      

    IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc。

     理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。

     ============================================

    IOC概念
      ioc是控制反转。从字面意义上理解,控制反转就是反过来控制。以前我们需要一个对象,都需要自己去new出来这个对象,控制反转之后,也就是说我们不需要主动自己去new这个对象,我们只要直接去接受这个对象就行了,换句话说这个对象被注入进来了,这就是DI的概念。

    IOC原理
      IOC的最大作用就是bean管理和解耦。到底是如何进行解耦的呢?下面我用数学中的有向图进行说明。我们可以把Spring管理的每一个Bean当做一个节点(假设有N个Bean,那么就有N个节点),于是这些Bean加上相互之间表示调用关系的有向边就组成了一个有向图。毫无疑问,有向图的边越多那么平均来说每个顶点之间的耦合度就越大,最大的情况为完全有向图,即任何两个节点之间都有两条有向边,此时每个顶点的度为2(N-1),也就是说每个Bean与其他的N-1个Bean有耦合,而且还是双向耦合。如下图所示:

        

      在编程的时候,我们都是本着高内聚、低耦合的编程方式,但是我们知道,要想达到完全的没有耦合是不可能的。所以能做的就是尽最大可能的保证松耦合。如何能减少类与类直接的耦合呢?一般我们都是用接口来实现。通过让类与类之间,依赖于接口,而不依赖于类,来达到松耦合的目的。但是无论耦合多么“松散”,具体的实现类还是需要new出来的,于是就得考虑这个new的过程应该放在哪里才是最合适的。如果在每个Bean中都去new这个Bean需要的其他Bean,那么耦合的程度又回到了上图的情况,那是没有意义的。所以我们就需要找一个中间人,在中间人那里实现new的过程,然后把new好的实例传递给需要这个实例的对象,这样的话一切问题就迎刃而解了。因此spring ioc容器就借助这个原理实现了bean管理和松耦合的功能。如下图所示:

      

      上图也就是Spring的数学描述,图中很清晰的表明了在使用Spring之后,任意两个节点(Bean)之间的有向线段变成了0(确切的说不完全是0,因为任意两个节点之间还是可以通过容器连接的),唯一和这些Bean有关系的是容器(无论谁需要什么东西都去找容器,尽量避免两个Bean之间直接打交道)也正因为如此Spring才达到了解耦的目的。

    ======================================================================

    ★AOP:Spring提供了面向切面的编程支持,AOP将与程序业务无关的内容分离提取,应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。

    AOP将与业务无关的逻辑横切进真正的逻辑中。

    面向切面编程(简称AOP )的目标:

    1.把横切关注点从业务逻辑中分离,独立模块化

    2.在不改变现有代码的前提下,动态的添加功能

    ★借助Spring,依赖注入,AOP应用,面向接口编程,来降低业务组件之间的耦合度,增强系统的扩展性。

       ★ 让已有的技术和框架更加易用。

       ★利用其对hibernate的SessionFactory、事务管理的封装,更简洁的应用hibernate。

       ★Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

         ★利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。

         ★低侵入式设计,代码污染极低。

    spring在项目中可以带来下面的好处进行了总结。

    ?? 1)降低组件之间的耦合度,实现软件各层之间的解耦。

    ????? Controller——>Service——>DAO

    ? 2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。

    3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。

    4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。

    5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。

    6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

    ?7)? 使用spring容器可以提供的服务:事务管理服务,JMS服务,Spring Core核心服务,持久化服务等。

    8)如果使用Spring, 我们就不再需要手工控制事务,例如在Hibernate中控制事务的语句 session.beginTransaction(); session.getTransaction().commit();

    1.1 springmvc框架

    第一步:发起请求到前端控制器(DispatcherServlet)

    第二步:前端控制器请求HandlerMapping查找 Handler

    可以根据xml配置、注解进行查找

    第三步:处理器映射器HandlerMapping向前端控制器返回Handler

    第四步:前端控制器调用处理器适配器去执行Handler

    第五步:处理器适配器去执行Handler

    第六步:Handler执行完成给适配器返回ModelAndView

    第七步:处理器适配器向前端控制器返回ModelAndView

    ModelAndViewspringmvc框架的一个底层对象,包括 Modelview

    第八步:前端控制器请求视图解析器去进行视图解析

    根据逻辑视图名解析成真正的视图(jsp)

    第九步:视图解析器向前端控制器返回View

    第十步:前端控制器进行视图渲染

    视图渲染将模型数据(ModelAndView对象中)填充到request

    第十一步:前端控制器向用户响应结果

    从实例中理解框架

      (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力。本博客会逐步推出一系列的关于大型网站架构、分布式应用、设计模式、架构模式等方面的系列文章)

      目前,各种开发框架非常流行,那么,什么是框架(Framework)?框架是如何产生的?为什么要使用框架,以及使用框架能给我们的开发带来什么样的好处呢?

       下面就以我们熟悉的web框架为基础来加深对框架的理解。

      在不使用Struts或者SpringMVCweb层框架时,一直是由Servlet完成业务逻辑的实现,但是,随着Servlet的增多,web.xml的配置会不断的膨胀,从而变得难以维护。针对这一问题,web框架提出的方案是:提炼一个核心的Servlet覆盖对所有http请求的处理。Spring MVC中是DispatcherServletStruts2是一个FilterDispatcher。 这样,web.xml中只需要对核心控制器进行配置就可以了,代码变得简洁且固定了。

      提炼出了核心控制器,还需要考虑后面的事情,就是怎样将不同的http请求分发到不同的action/controller对象上去进行业务处理,怎样将对应的处理结果返回到客户端。这一系列的逻辑流程由谁控制,又由谁负责具体实现,这些实现又如何关联到一起?

          我们使用框架就是为了不再自己控制这些公共的问题,而将更多的精力放在业务的处理上,那么,这些事情自然是由框架来完成了。

          以SpringMVC为例,核心控制器DispatcherServlet将从http请求开始到输出返回结果这期间的每一个处理步骤分派到不同的组件中进行处理,HandlerMaping负责将一个url指定到一个对应的controller上,HandlerMapping负责指定执行 controller中的哪个方法,ViewResolver根据controller中返回的viewName,结合配置文件信息,创建出合适类型的 view对象,而DispatcherServlet这个类本身负责初始化需要的组件以及对组件方法的调用。可以理解为核心控制器规范处理流程,各个组件实现处理流程。

          StrutsSpringMVC框架还给我们提供了收集表单数据,完成数据类型转换,表单验证、异常处理等功能,这这细节也为开发人员提供了很大的便利。

    从上面通俗的描述,我们应该可以理解到:
          框架是为了解决在某个领域开发中所碰到的困境,包含了一系列的最佳实践,作用是解决某个领域的问题。     
          框架是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例之间交互的方法.
          框架是包含了一些通用功能的半成品,开发人员可以在框架的基础上进行二次开发。

  • 相关阅读:
    正则表达式学习《一》
    vs2008添加模板方法
    MongoDB学习笔记《二》
    oracle存储过程错误分析
    最近一个星期的学习,比较杂乱
    C#中的委托和事件
    c++随机数字
    Delphi中的接口
    C# 泛型
    LoadString、LoadIcon和LoadCursor函数
  • 原文地址:https://www.cnblogs.com/jiahaoJAVA/p/6747758.html
Copyright © 2011-2022 走看看