Spring-Spring的介绍和SpringFrameWork使用

一、什么是Spring框架

Spring框架是一种轻量级框架

  • Spring中提供了多种功能模块,可以根据自己功能需求定制模块,只需要引入对应需求的模块使用就可以了;并不需要像重量级框架,需要使用一个功能模块就必须要把整个框架拿过来。

Spring基本模块

  • Spring基本模块:Spring架构是一个分层架构,由基本7个定义良好的模块组成。Spring模块构建在Core Container核心容器之上。

  • 组成Spring框架的每个模块都可以单独存在,或者与其一个或多个模块联合起来实现。每模块的功能如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvZYBo7J-1574091675370)(E:\杰普实训\第三阶段\spring\10-21 Day1\Spring基本模块.png)]

    1. Spring Core:核心容器,提供Spring框架的基本功能,管理者Spring应用bean的创建,配置和管理

      • 核心容器的主要组件是BeanFactory,是工厂模式的实现。BeanFactory使用依赖注入将应用程序的配置和依赖性与实际的应用程序代码分开
      • Spring框架中的容器可以管理项目中各种对象的生命周期(对象的创建,初始化,使用以及销毁),前提是项目中使用Spring框架,并且把这些需要管理的对象注入到Spring容器
    2. Spring Context:Spring应用程序对象,Spring上下文是一个配置文件,向Spring框架提供上下文信息。提供了一种框架式的对象访问方式,有些像 JNDI( Java Naming and Directory Interface ),是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。

      • 扩展了BeanFactory的概念,增加了对国际化,事件传播,以及验证等的支持,此外还提供了许多企业服务及模板框架集成的支持
    3. Spring AOP:为Spring容器管理的对象提供切面编程的支持

    4. Spring DAO:该层封装了对数据库的访问,并且处理了其抛出了错误信息,同时还基于AOP模块提供了事务管理

    5. Spring ORM:Spring支持多种ORM框架,简化了数据操作

    6. Spring Web:Web上下文模块建立在应用程序上下文模块之上,为基于web应用程序提供了上下文。

    7. Spring MVC:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成了为高度可配置的,MVC容纳了大量视图技术,其中包括JSP,Velocity,Tiles,iTest和POI

Spring-Spring的介绍和SpringFrameWork使用_第1张图片

Spring划分为五大部分

  • Core Container :

    Core Container(核心容器):包含有Core、Beans、Context和Expression Language模块。
    
    Core和Beans模块:框架的基础部分,提供IoC(反转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正的允许你从程序逻辑中分离出依赖关系和配置。
    
    Context模块:构建于Core和Beans模块基础之上,提供了一种类似于JNDI:Java 命名与目录接口(Java Naming and Directory Interface)注册器的框架式的对象访问方法。Context模块继承了Beans的特性,然后添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。Context模块同时也支持J2EE的一些特性,例如EJB、JMX和基础的远程处理。ApplicationContext接口是Context模块的关键。
    
    Expression Language模块:Expression Language模块提供了一个强大的表达式语言用于在运行时查询和操纵对象。它是JSP2.1规范中定义的unifed expression language的一个扩展。该语言支持设置/获取属性的值、属性的分配、方法的调用、访问数组上下文(accessiong the context of arrays)、容器和索引器、逻辑和算术运算符、命名变量以及从Spring的IoC容器中根据名称检索对象。它也支持list投影、选择和一般的list聚合。
    
  • Data Access/Integration :数据访问/集成部分

    Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。
    
    JDBC模块:该模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
    ORM模块:该模块为流行的对象-关系映射API——JPA、JDO、Hibernate、iBatis等提供了一个交互层。利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射。如前边提到的简单声明性事物管理。
    OXM模块:该模块提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。
    JMS模块:JMS(Java Messaging Service)模块主要包含了一些制造和消费消息的特性。
    Transaction模块:该模块支持编程和声明性的事物管理,这些事物类必须实现特定的接口,并且对所有的POJO都适用。
    
  • Web :

    Web层包含了Web、Web-Servlet、Web-Struts、Web-Porlet模块。
    
    Web模块:该模块提供了基础的面向web的集成特性。例如多文件上传、使用servlet listeners初始化IoC容器以及一个面向web的应用上下文。它还包含Spring远程支持中web相关部分。
    
    Web-Servlet模块:该模块包含Spring的model-view-controller(MVC)实现。Spring的MVC框架使得模型范围内的代码和web forms之间能够清楚的分离开来,并与Spring框架的其他特性集成在一起。
    Web-Struts模块:该模块提供了对Struts的支持,使得类在Spring应用中能够与一个典型的Struts web层集成在一起。注意,该支持在Spring 3.0中是deprecated的。
    Web-Porlet模块:提供了用于portlet环境和Web-Servlet模块的MVC的实现。【???】
    
  • AOP和Instrumentation

    AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义,例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点像.net中的attribute的概念。
    
    Aspects模块提供了对AspectJ的集成支持。
    
    Instrumentation模块提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用。
    
  • Test

    Test模块支持使用JUnit和TestNG对Spring组件进行测试。
    

Spring框架的优点

  • Spring框架带来的好出:
  1. 动态耦合,方便开发,面向接口编程:通过Spring提供的容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成过度程序耦合。
  2. 方便程序测试:Spring框架提供了test模块,可以和许多主流框架相结合
  3. 降低J2EE API的使用难度:Spring对很多难用的Java EE API提供了一个简单的封装层,通过Spring的简易封装,这些Java EE API使用难度降低。
  4. 方便集成各种优秀框架(Struts,Hibernate,Hessian)等直接支持
  5. AOP编程支持:通过Spring提供的AOP功能,方便进行面向切面编程
  6. 声明事务的支持:在Spring中,我们可以从事务管理代码解脱出来,通过声明方式灵活地进行事务管理,提高开发效率和质量
  7. Spring是一个模块化的项目,可以根据自己的需求定制功能模块
  • 核心宗旨:简化企业级应用开发,同时给复杂问题提供强大的、非侵入性解决方案

  • 入侵和非入侵区别

    • 1、设计理念不同
      • 侵入式设计,就是设计者将框架功能“推”给客户端;
      • 而非侵入式设计,则是设计者将客户端的功能“拿”到框架中用。
    • 2、设计表现不同
      • 侵入式设计有时候表现为客户端需要继承框架中的类;
      • 而非侵入式设计则表现为客户端实现框架提供的接口。
    • 3、依赖性不同
      • 侵入式让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。但侵入式可以使用户跟框架更好的结合,更容易更充分的利用框架提供的功能。
      • 非侵入式的代码则没有过多的依赖,可以很方便的迁移到其他地方。但是与用户代码互动的方式可能就比较复杂。

二、Spring FrameWork(轻量级)

Spring IOC

  • Spring Core:Spring 核心容器,提供 Spring 框架的基本功能,管理着Spring应用中bean的创建、配置和管理。

  • Spring FrameWork将功能分为多个小功能,即多个小模块(轻量级),按照具体需求定制服务(引入具体功能模块),只需要导入指定一些小模块的jar包就可以了

  • Spring IOC(Inversion of Control控制反转):是一种降低对象耦合关系的设计思想

    1. 一般而言,在分层结构中都是上层调用下层的接口,上层依赖于下层执行,即调用者依赖于被调用者

    2. 通过IoC方式,使上层不再依赖于下层接口,通过采用一定的机制选择不同的下层来实现,完成控制反转,使得调用者来决定被调用者。

    3. IoC通过注入实例化对象来达到解耦合的目的,对象不会被显示的调用而是通过IoC容器(Spring容器)来提供

    4. 由开发人员主动创建对象转变为Spring控制对象的生命周期

    5. 由开发人员主动调用对象,设置对象属性到Spring管理对象,开发人员接受,并使用Spring管理的各种对象

    6. 对象之间的关联关系可以通过xml配置文件控制:

    • Spring的xml配置文件使用的Shema约束

    • Mybatis的xml配置文件使用的DTD约束

  • 依赖注入(DI:Dependency Injection ):依赖注入的概念提出是替代控制反转的,表示让调用类对某一接口实现类的依赖关系由容器注入(由容器管理调用类和被调用实现类接口的关联关系),以移除调用类对某一接口实现类的依赖

  • 依赖查找(DL:Dependency Loopup):容器创建对象并提供回调接口和上下文环境,给这个对象,需要是通过接口从容器查找其他对象(XxxAware接口)

  • Spring IOC核心API:

    • BeanFactory接口:是Spring中IOC容器的核心接口,主要用于处理Bean容器对象的初始化和配置,建立对象的联系

      //根据指定名称返回一个Bean实例
      Object getBean(String name) 
      
      //判断名称为name的Bean是否是原型,即是否总是返回一个新实例
      boolean isPrototype(String name)   
      
      //判断名称为name的Bean是否是单例
      boolean isSingleton(String name)   
      
      //判断容器中是否包含给定名称的Bean实例
      boolean containsBean(String name)  
      
      //如果名称为name的Bean有别名则返回所以别名
      String[] getAliases(String name)  
      
    • ApplicationContext接口:该接口继承BeanFactory,增强了BeanFactory,增强了事务处理AOP,国际化,以及事件传递功能。一般会使用ApplicationContext接口

      String path = "com/briup/ioc/set/set.xml";
      ApplicationContext container = new ClassPathXmlApplicationContext(path);
      
  • Spring配置文件:读取配置文件中标签,创建对应的各个对象进行实例化

    XML基本结构如下:
    	
    	<beans xmlns="http://www.springframework.org/schema/beans"
    		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    		xmlns:context="http://www.springframework.org/schema/context"
    		xsi:schemaLocation="http://www.springframework.org/schema/beans
    		   http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    		   http://www.springframework.org/schema/context
    		   http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    	   
    	beans>
    	
    注意事项:
    1.这个文件的头部声明可以在下载的spring文档中的示例找到
    2.这里面用到了俩个schema文件(.xsd文件),分别是spring-beans-3.2.xsd和spring-context-3.2.xsd,它们也可以在下载的spring文档中找到
    3.在Eclipse中把xml文件和schema文件关联后,xml中就可以有标签代码的提示了(注意关联时别配置错了)
    4.spring框架是模块化的,之后使用其他模块的时候,还可以在该xml的根元素中继续引用其他模块中相应的schema文件,然后就可以使用引入新模块中的标签代码了
    
    
    
    1.id属性命名必须满足XML的命名规范,id值标识对象唯一。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab "等都是不规范的,Spring在初始化时就会报错,诸如:
    代码
    org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name.
    
    2.name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:
    代码
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined
    
    3.配置文件中id唯一标识一个对象的<bean>,否则在初始化时即会报错,如:
    代码
    org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document.
    
    4.但配置文件中允许出现两个name相同的<bean>,在用getBean()返回指定实例对象的时候,不知道具体是哪一个对象,会报错(对象的名字已经存在)。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。
    
    5.name属性可以用,或者空格隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)
    
    6.如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过
    getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
    
    7.如果存在多个id和name都没有指定,且实例类都一样的<bean>,如:
    代码
    <bean class="com.stamen.BeanLifeCycleImpl"/>
    <bean class="com.stamen.BeanLifeCycleImpl"/>
    <bean class="com.stamen.BeanLifeCycleImpl"/>
    
    则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,
    第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,
    第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。
    
  • set方式注入到Spring容器中

    
    
    
    
    
    
  • 描述Spring框架原理的几个问题:

    • 1.Spring中如何帮助我们管理对象:将要管理的对象,交给配置给Spring容器

    • 2.如何将对象配置给Spring容器

    • 3.哪些对象可以配置给Spring容器

    • 4.配置到容器中的类对象叫什么

    • 5.配置进去之后,有什么好处

  • Spring可以理解为项目的管家

    • 1.Spring帮助我们管理对象的生命周期
    • 2.Spring将原本写死的功能代码进行分开,项目运行期间动态绑定对应的类型,执行对应类型的具体功能
    • 3.Spring帮我们处理类和类之间的关联关系



- 描述Spring框架原理的几个问题:

 - 1.Spring中如何帮助我们管理对象:将要管理的对象,交给配置给Spring容器

 - 2.如何将对象配置给Spring容器

 - 3.哪些对象可以配置给Spring容器

 - 4.配置到容器中的类对象叫什么

 - 5.配置进去之后,有什么好处

   

- `Spring`可以理解为项目的管家
 - 1.Spring帮助我们管理对象的生命周期
 - 2.Spring将原本写死的功能代码进行分开,项目运行期间动态绑定对应的类型,执行对应类型的具体功能
 - 3.Spring帮我们处理类和类之间的关联关系

你可能感兴趣的:(Spring,Spring,SpringFrameWork)