Spring学习(一)---基础入门

什么是Spring

  • Spring是一个轻量级的控制反转IoC/DI依赖注入和面向切面AOP的开源容器框架,是一个开源的Java/Java
    EE全功能栈full-stack的应用程序框架,以Apache许可证形式发布
  • 它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的, 2002年Rod Johnson在他的Expert
    One-On-One Java EE Design and
    Development一书中首次发布了这个框架,并奠定了作者的大师地位。该框架也可以移植到.NET的环境下。
  • Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里,Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看,Spring给予了Java程序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于使用的方法。
  • Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中,大量的拓展和改进得以形成。为此,Spring获得了广泛的欢迎,并被许多公司认可为具有战略意义的重要框架。

Spring框架4大原则:

  • 使用POJO进行轻量级和最小侵入式开发
    POJO(Plain Ordinary Java
    Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
  • 通过控制反转IoC、依赖注入DI和基于接口编程实现松耦合
  • 通过AOP和默认惯例进行声明式编程
  • 使用AOP和模板编程减少模式化代码

Spring框架的主要功能

  • 基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注射技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。

  • 一个核心的,全局适用的bean工厂

  • 一个一般抽象化的层面来管理数据库间的数据处理

  • 建立在框架内的,对Java数据处理API和单独的JDBC数据源的一般性策略。因此,在数据处理支持上对Java企业版本环境的依赖性得以消除

  • 和一些整合持久化的框架,如Hibernate,JDO,iBATIS和db4o,的整合

  • web应用中的MVC框架,基于核心的Spring功能,支持多种产生视图的技术,包括JSP,FreeMarker,Velocity,Tiles,iText,和POI

  • 大量的AOP框架以提供诸如数据处理管理的服务。同IOC的功能一样,目的是提高系统的模块化程度

BeanFactory和ApplicationContext 之间的关系

  • BeanFacotry是spring中比较原始的Factory,提供了IoC/DI容器使用的最基本的方法。ApplicationContext接口由BeanFactory接口派生而来,在提供BeanFactory所有的功能基础上提供了企业级应用开发的支持,例如读取资源文件、发布事件等。
  • BeanFactory针对单例的受管bean采用的是延迟加载,ApplicationContext采用的是立即加载【所有的prototype受管bean都是延迟】。所以BeanFactory一般用于内存敏感的受限环境开发中,ApplicationContext一般使用

基本框架结构

  • Spring是一种JavaEE开发中的一站式解决方案,所以其中包含的内容比较多,为了避免在应用中添加无用功能,所以Spring采用了非强制性的模块化结构,在具体应用中,可以根据应用所需要的功能进行选择添加。

    Spring3.x分为6大模块,Spring的模块化是很强的,各个功能模块都是独立的,可以选择的使用

    这里写图片描述

  • Core模块是Spring应用的基础,提供了最基本的IoC/DI容器的支持和实现
  • AOP模块建立在Core模块的基础上,提供了AOP技术的支持,以简化AOP编程的复杂度
  • DAO和ORM模块建立在AOP的基础上,DAO提供了dao模式编程的简化支持,ORM提供了整合持久层框架的支持。同时在AOP的基础上给数据库访问提供了声明式事务的支持。
  • JEE模块建立在Core模块的基础上,提供了针对EJB\邮件javaMail等企业级应用支持

Spring4.x分为6大模块,包括20多个子项目

这里写图片描述

  • Core container核心容器:beans core context context-support expression
  • AOP和apects提供AOP编程技术支持: aop aspects,另外还有其它的不是Spring的jar
  • Data Access/Integration针对DAO编程和ORM整合的支持: jdbc orm tx
  • Web提供了整合表现层框架和对应的web解决方案SpringMVC:web webmvc
  • Instrumentation底层基础,是一种没有图形界面的,具有启动能力的,用于监控其他类的工具类
  • Test提供了单元测试的支持,要求junit4.8+版本

Spring的全方位应用程序框架

这里写图片描述

  • ssm=SpringMVC+Spring+MyBatis [一般开发中常用,尤其是互联网应用开发类型的公司,一般中小型快速开发中应用]
  • ssh[2]=Struts2+Spring+Hibernate [使用较少,一般在大型软件公司中长期使用]

受管bean

  • Spring中那些组成应用的主体以及由Spring
    IoC容器所管理的对象被称之为bean。Bean就是由Spring容器初始化、装配以及被管理的对象
  • bean是Spring管理的基本单位,在Spring的应用中,所有的组件都是bean,bean包括数据源、
    Hibernate的SessionFactory及事务管理器等。 Spring里的bean是非常广义的概念,任何的Java对象,
    Java组件都可被当成bean处理。甚至这些组件并不是标准的JavaBean

bean中行为的scope配置

  • singleton单例,是默认属性:Spring将Bean放入Spring
    IoC容器的缓存池中,并将Bean引用返回给调用者,spring
    IoC容器负责对这些Bean进行后续的生命管理。BeanFactory只管理一个共享的实例。所有对这个特定bean的实例请求,都导致返回这个唯一bean实例的引用。即每次拿到的对象都是引用的同一个地址的对象。当一个bean被标识为singleton时候,spring的IoC容器中只会存在一个该bean。
  • prototype原型:不管是BeanFactory或者ApplicationContext都是延迟加载使用的。每次对这个bean的实例请求都会导致一个新的实例的创建。当用户需要不受其他用户对象影响的对象或有类似的需求时,这是一个较理想的解决办法。即每次拿到的对象都是引用的不同地址的对象。相当于一个new的操作。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责
  • 以下3种scope都使用的较少,有request\session\global session,类似于JavaEE里面的request和session。在使用SpringMVC是可能会用到
  • request表示针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,session表示一个用户【客户】对应一个新的bean,global session作用域类似于标准的HTTPSsession作用域,不过仅仅在基于portlet的web应用中才有意义
  • 注意:对于struts2中的Action来说需要指明scope=prototype,因为struts2的Action要求是多实例、单线程的.
  • 正转:当需要使用某个对象时,由调用方负责创建和管理这个对象。
  • 控制反转:当需要使用某个对象时,调用方并不负责创建和管理这个对象的声明周期,而是由容器负责创建和管理。控制权限的反转。

控制反转和依赖注入的概念

  • IoC实现由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,控制权由应用代码中转到了外部容器,控制权的转移,是所谓控制反转
  • 可供选择的IoC 容器: Apache Avalon、PicoContainer 和 HiveMind。Avalon
    从没怎么流行,尽管它很强大而且有很长的历史。Avalon相当的重和复杂,并且看起来比新的IoC解决方案更具侵入性。PicoContainer是一个轻量级而且更强调通过构造函数表达依赖性而不是JavaBean
    属性。 与Spring不同,它的设计允许每个类型一个对象的定义(可能是因为它拒绝任何Java代码外的元数据导致的局限性)
  • Martin Fowler给IoC起更为直观的名字:Dependency
    Injection依赖注射DI。创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入
    <bean id=”bb” class=”com.yan.Person” p:birth-ref=”now”/>
  • 针对Person属性birth由容器负责调用Person对象的setBirth将now对象设置进去

两者区别详见:
http://blog.csdn.net/uponz/article/details/79169843

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章