• Spring


    本人才疏学浅,如有错误欢迎指正!转载请注明出处!https://www.cnblogs.com/lee-yangyaozi/p/11052701.html

    什么是框架&库

    在开发中经常听到的两个词语:框架、库。那么到底什么是框架和库呢?

    框架就好比一台组装完好的电脑,买回来就可以直接用,但想要正确运行必须要遵循电脑厂商规定的使用规范去使用。

    库就好比电脑内的不同的组件,比如主板、CPU等,单独一个库并不能支持一个项目的运行,需要多个库组装成一个电脑为程序提供一个运行环境。

    库和框架的区别基本上就是:框架拿来就用,无需过多的配置,但必须按照框架的规范,需要自定义功能时不灵活;库则不能直接使用,需要与自己的代码或其他库协同工作,但可以根据需要灵活选择库甚至自己开发库。

    什么是Spring

    说起Spring,首先应该先说一下什么是SSM。SSM指的是SpringMVC、Spring、MyBatis三个框架,这三个框架分别对应JavaEE开发中项目分层后的Controller(Servlet)、Service、Dao。

    Spring是一个基于IOC和AOP来构架多层JavaEE系统的开源框架,主要目的是为了简化企业开发。

     

    Spring的特点

    • 简化开发:可以将所有的对象的创建和依赖关系交给Spring进行管理
    • AOP面向切面编程:可以对程序进行横向截取,以增强程序的功能
    • 简化事务:只需简单的配置即可完成事务的管理
    • 简化测试:Spring对Junit4的支持,可以通过注解进行测试
    • 对主流优秀开源框架有直接的支持,如Struts、Hibernate、MyBatis、Quartz 等
    • Spring对 JavaEE 开发中非常难用的API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

    Jar包说明

    核心模块

    • spring-core:这个jar文件包含Spring框架基本的核心工具类,Spring其它组件都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类;
    • spring-beans:这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行IoC/DI操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring- beans.jar文件就可以了;
    • spring-context:Spring核心提供了大量扩展,这样使得由 Core 和 Beans 提供的基础功能增强:这意味着Spring 工程能以框架模式访问对象。Context 模块继承了Beans 模块的特性并增加了对国际化(例如资源绑定)、事件传播、资源加载和context 透明化(例如 Servlet container)。同时,也支持JAVA EE 特性,例如 EJB、 JMX 和 基本的远程访问。Context 模块的关键是 ApplicationContext 接口。spring-context-support 则提供了对第三方库集成到 Spring-context 的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等;
    • spring-expression:为在运行时查询和操作对象图提供了强大的表达式语言。它是JSP2.1规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等;

    数据访问与集成层包含 JDBC、ORM、OXM、JMS和事务模块

    • spring-jdbc:提供了 JDBC抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析;
    • spring-tx:支持编程式事务和声明式事务,可用于实现了特定接口的类和所有的 POJO 对象。编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细;
    • spring-orm:提供了对流行的对象关系映射 API的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring 的其它功能整合,比如前面提及的事务管理;
    • spring-oxm:模块提供了对 OXM 实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等;
    • spring-jms:模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了 spring-messaging 模块;

    Spring 处理Web层模块

    • spring-web:提供面向 web 的基本功能和面向 web 的应用上下文,比如 multipart 文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分;
    • spring-webmvc:为 web 应用提供了模型视图控制(MVC)和 REST Web 服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成;
    • spring-webmvc-portlet:(即Web-Portlet模块)提供了用于 Portlet 环境的 MVC 实现,并反映了 pring-webmvc 模块的功能;

    Spring AOP模块

    • spring-aop:提供了面向切面编程(AOP)的实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦。使用源码级的元数据;
    • spring-aspects:提供了对 AspectJ 的集成;

    Instrumentation 模块

    • spring-instrument:模块提供了对检测类的支持和用于特定的应用服务器的类加载器的实现;
    • spring-instrument-tomcat:模块包含了用于 Tomcat 的Spring 检测代理;

    Messaging消息处理模块

    • spring-messaging:从 Spring 4 开始集成,从一些 Spring 集成项目的关键抽象中提取出来的。这些项目包括 Message、MessageChannel、MessageHandler 和其它服务于消息处理的项目。这个模块也包含一系列的注解用于映射消息到方法;

    Test模块

    • spring-test:通过 JUnit 和 TestNG 组件支持单元测试和集成测试。它提供了一致性地加载和缓存 Spring 上下文,也提供了用于单独测试代码的模拟对象(mock object);

    IOC&DI

    IOC(Inversion of Control)控制反转,DI(Dependency Injection)依赖注入是Spring的灵魂,这两个词其实说的是一件事的不同阶段,那么到底什么是IOC&DI呢?

    我们在写代码的时候,我相信各位使用最多的关键字就是"new"了,这是创建一个对象的关键字,在Java的面向对象思想中,万物皆对象,想要执行某个操作必须由一个对象去执行,那在这之前就要new一个对象出来。系统创建对象是需要消耗性能的,需要为这个对象分配内存空间以及相关资源,反复的创建对象不光会消耗大量的服务器性能,而且可能会来不及gc导致内存占用。

    为了解决这个问题,我们把对象的创建与管理交由spring执行,spring关于对象的管理原则是:在项目启动时创建相关对象,并默认是单例对象,我们使用相关对象时只需在类中注入该对象就可以使用了。

    所以IOC指的是项目刚启动时的动作:通过IOC,开发人员不需要关心对象的创建过程,交给Spring容器完成。具体的过程是,程序读取Spring 配置文件,获取需要创建的 bean 对象,通过反射机制创建对象的实例。由于是通过反射构建对象,因此会对性能有所影响,但是请注意,这步操作是在项目刚启动时,此时并没有用户访问,所以性能下降最多就是项目启动花费时间较多,总比在项目运行过程中频繁创建对象导致性能下降给用户带来不良体验强吧。

    现在我们已经有了相关的对象,现在就是要使用这些对象了。在项目分层中,我们一般都是Controller层调用Service层对象,Service层调用Dao层对象。在spring中,我们只需要在Controller中注入Service层的对象,就可以在Controller中使用Service对象了,这就是依赖注入:说的是创建对象实例时,同时为这个对象注入它所依赖的属性。相当于把每个bean与bean之间的关系交给容器管理。而这个容器就是spring。

    配置spring的配置文件

    spring是根据配置文件的内容在项目启动时进行相关操作的,其配置文件是xml格式的文件,bean标签就是对象管理标签,该标签内部有以下几个属性:

    • class:指定bean对应类的全路径
    • name:name是bean对应对象的一个标识
    • scope:执行bean对象创建模式和生命周期(默认单例)
    • id:id是bean对象的唯一标识,不能添加特别字符
    • lazy—init:是否延时加载 默认值:false;只对单例有效,设为true是对象在第一次使用时创建
    • init-method:对象初始化方法
    • destory:对象销毁方法

    每一个bean标签对应一个实体类,但一个项目中的实体类往往是非常多的,这么一个一个去配置,效率非常低,spring有一种包级别的IOC,也就是该包下所有类全部托管到spring:<context:component-scan base-package="packageName" />

  • 相关阅读:
    [bzoj1500][luogu2042][cogs339][codevs1758]维修数列(维护数列)
    无旋treap的简单思想以及模板
    [hdu2036]改革春风吹满地
    (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
    [bzoj3875][Ahoi2014]骑士游戏
    [bzoj1433][ZJOI2009]假期的宿舍
    <struct、union、enum>差异
    LeetCode(50) Pow(x,n)
    LeetCode(49)Group Anagrams
    LeetCode(48)Rotate Image
  • 原文地址:https://www.cnblogs.com/lee-yangyaozi/p/11052701.html
Copyright © 2020-2023  润新知