首页 > 其他分享 >Spring框架(入门到精通一)

Spring框架(入门到精通一)

时间:2024-07-08 23:01:30浏览次数:21  
标签:精通 入门 Spring Pivotal 模块 spring org 日志

重生之我在CSDN学java 第六天(Spring)

文章目录

一、Spring的历史

1. Spring 发展历程

在JavaEE诞生的很长一段时间里,EJB技术被认为是J2EE的核心。但是不管从开发阶段,还是运行时看,EJB 都太过臃肿。
Rod Johnson于2002年写了两本引发J2EE地震的书:《Expert One-on-One J2EE Design andDevelopment》和《Expert One-on-One J2EE Developmentwithout EJB》。在《Expert One-on-One J2EE Design andDevelopment》中Rod Johnson总结J2EE各种技术的优缺点以及目前流行框架的优缺点。然后在这本书中对于这些“问题”给出了自己的解决方案。这些解决方案被整理后就是Spring框架最初的原型,当初它的名字不叫Spring而是叫interface21。在《Expert One-on-One J2EE Developmentwithout EJB》中Rod Johnson总结了EJB所存在的问题,以及如何使用Spring框架构建没有EJB的J2EE企业级系统。在这本书中Rod Johnson展示了Spring 框架
给J2EE技术带来的前所未有的进步。
在这里插入图片描述
2003 年,Rod Johnson 和同伴创建了 Spring公司 ,在interface21的基础上开发了一个全新的框架命名为 Spring,据 Rod Johnson 介绍, Spring 是传统 J2EE 新的开始,随后 Spring 发展进入快车道。
2004 年 03 月,1.0 版发布。
2006 年 10 月,2.0 版发布。
2007 年 11 月,公司更名为 SpringSource,同时发布了 Spring 2.5。
2009 年 12 月,Spring 3.0 发布。
2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。
2017 年 09 月,Spring 5.0 发布。

2. Spring 所属公司

1989 年,Rob Mee 创立咨询公司 Pivotal Labs,专注于快速的互联网式软件开发,即敏捷编程。创立Pivotal Labs 的时候,它还是一家非常小的软件顾问公司,它的主营业务就是与客户合作,帮助客户开发软件。
2012 年,EMC 以现金方式收购了 Pivotal 并照单全收了它的 200 名员工。刚开始的时候,公司并没有发生太大的变化,只是作为新部门成为了 EMC 的一部分,Pivotal Labs 仍然继续像以前样与客户合作。
2013 年,EMC 和 VMware 分拆出其 Cloud Foundry、Pivotal Labs、Greenplum 等云计算、大数据资源,GE(通用电气) 投资 1.05 亿美元,成立新公司 Pivotal。
Pivotal 公司成立之后,于 2014 年发布了 Spring Boot,2015 年发布了 Spring Cloud,2018 年Pivotal 公司在纽约上市。
Pivotal 公司可谓是大牛云集,公司的常见开源产品(https://pivotal.io/cn/open-source)有:Spring以及 Spring 衍生产品、缓存中间件 Redis、消息中间件 RabbitMQ、机器学习库MADlib等。
1989 年,Rob Mee 创立的咨询公司 Pivotal Labs;
2003 年,Rod Johnson 和同伴创建了 Spring;
2003 年,EMC 收购了 VMware 公司;
2009 年,VMware 以 4.2 亿美元收购 Spring Source (3.6亿现金外加5800万股份) 。 ;
2012 年,EMC 又收购了 Pivotal Labs 公司;
2013 年,EMC 、 VMware 和收购来的 Pivotal Labs 公司重新组建了新的公司 Pivotal;
2015 年,戴尔又并购了 EMC;
2018 年,戴尔独立上市。

二、 Spring介绍

Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用。Spring是模块化的,所以可以只使用其中需要的部分。 以下是Spring4的运行时结构图:
在这里插入图片描述

1. Spring模块介绍

核心容器(Core Container)

核心容器包括spring-core,spring-beans,spring-context,spring-context-support和spring expression(SpEL)等模块。
spring-corespring-beans模块是Spring框架的基础,包括控制反转依赖注入)等功能。
BeanFactory是工厂模式的复杂实现。可以把配置和依赖从实际编码逻辑中解耦。
spring-context模块是在Core和Bean模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化、事件传播、资源加载等功能。
Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
spring-expression模块提供了强大的表达式语言用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。

AOP及 Instrumentation

spring-aop模块提供了面向切面编程(AOP)的实现,可以定义诸如方法拦截器和切入点等,从而使横切的代码彻底的解耦出来。
spring-aspects模块提供了对AspectJ的集成。
spring-instrument模块通过agent保存了一个Instrumentation实例,目前主要用来实现AOP的
加载时植入。
spring-instrument-tomcat模块是spring-instrument模块对应于tomcat的处理模块。

消息(messaging)

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

数据访问/集成

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

Web

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

测试(Test)

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

三、Spring 工程搭建

1. 工程依赖

Spring 的依赖项可以先下载好,然后导入工程,如果是Maven工程,使用Maven的依赖管理导入
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lwf</groupId>
    <artifactId>SpringDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!-- maven:编译版本,源码 字符集,或者可以配置maven-compiler-plugin -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <!--依赖版本属性:版本的依赖关系可以查询maven中央仓库-->
        <org.springframework-version>4.3.8.RELEASE</org.springframework-version>
        <log4j2-version>2.7</log4j2-version>
        <junit-version>4.12</junit-version>
        <mysql-connector-java-version>8.0.17</mysql-connector-java-version>
        <mybatis-version>3.4.6</mybatis-version>
        <mybatis-spring-version>1.3.1</mybatis-spring-version>
    </properties>
    <dependencies>
        <!--spring-context:IOC必选,spring上下文包 -->
        <!--依赖传递导入:commons-logging、spring-core、spring-beans、springexpression、spring-apo-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--spring-aop:AOP必选,spring-aop包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--spring-aspects:AOP必选,spring非经典AOP的依赖 -->
        <!--依赖传递导入:aspectjweaver-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--spring-jdbc:Data Access-jdbc必选,spring jdbc整合包 -->
        <!--依赖传递导入:spring-tx-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <!--mysql-jdbc:mysql必选,JDBC驱动 -->
        <!--依赖传递导入:protobuf-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java-version}</version>
        </dependency>
        <!--mybatis-spring:spring整合mybatis的包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring-version}</version>
        </dependency>
        <!--mybatis: -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis-version}</version>
        </dependency>
        <!--spring-test:spring-test必选,整合测试工具 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
            <scope>test</scope>
        </dependency>
        <!--junit:必选,junit包 -->
        <!--依赖传递导入:hamcrest-core -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit-version}</version>
            <scope>test</scope>
        </dependency>
        <!--log4j-jcl:可选,commons-logging和log4j的桥接包 -->
        <!--依赖传递导入:log4j-api-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>${log4j2-version}</version>
        </dependency>
        <!--log4j-core:可选,log4j2的核心包 -->
        <!--依赖传递导入:log4j-api-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2-version}</version>
        </dependency>
    </dependencies>

</project>

配置解析

xmlns: XML Namespace的缩写,可译为“XML命名空间”,主要为了解决两个文档包含同名元素时引发的命名冲突。
xmlns:xsi:定义一个Schema的实例命名空间。只有做了这个定义才能使用schemaLocation属性。
xsi:schemaLocation:定义了XML Namespace和对应的XSD(Xml Schema Definition)文
档的位置的关系。
注意:Maven工程需要将配置文件放置在 resources 目录下。

3. 启动容器API

ApplicationContext 表示Spring容器,负责根据配置文件创建、组装对象实例,常用实现:
ClassPathXmlApplicationContext :从ClassPath下加载配置文件,根路径为ClassPath
FileSystemXmlApplicationContext:按照文件路径加载配置文件
示例:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });

4. 容器日志

Commons Logging

Spring使用的日志工具是Jakarta Commons Logging API(JCL),Common-Logging为其他日志工具提供一个抽象层,主要为中间件和工具开发者提供日志系统的切換:
Commons Logging会自动查找可用的日志系统, Commons Logging装载日志系统的流程如下

  1. 查找名为org.apache.commons.logging.Log的属性配置,该属性可通过代码或者配置文件
    <commons-logging.properties>配置。如配置使用log4j2:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLoggero
rg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFac
toryImpl
  1. 查找名为org.apache.commons.logging.Log的系统属性 。
  2. 如果Log4J日志记录系统在应用程序类路径中可用,使用相应的包装(Log4JLogger)。
  3. 如果应用程序在JDK 1.4系统上执行,使用相应的包装器类(Jdk14Logger)。
  4. 默认的简单日志记录包装器(SimpleLog)。
private static Log commonsLogger = LogFactory.getLog(Step01.class);
public static void main(String[] args) {
		commonsLogger.info("commonsLogger....................");
}
Log4j2

Log4j2是Java中使用频率非常高的日志系统,Commons Logging 可以桥接到Log4j2,使用步骤如下
1、 导入Log4j2相关包:
log4j-jcl-2.7.jar:与Commons Logging 的桥接包
log4j-core-2.7.jar:log4j的实现
log4j-api-2.7.jar:日志接口和创建Logger实例的工具类,便于log4j桥接到其它日志工具,如:SLF4J
2、配置Commons Logging使用Log4j2(可选)
Commons Logging可以自动查找类路径下的日志系统,如需指定,可以在类路径下创建 commonslogging.properties 配置文件,配置文件内容参考前置章节。
3、Log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- status属性表示log4j2本身的日志信息打印级别 -->
<configuration status="error">
    <!--先定义所有的appender -->
    <appenders>
        <!--这个输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝
            (onMismatch) -->
            <ThresholdFilter level="trace" onMatch="ACCEPT"
                             onMismatch="DENY" />
            <!--日志的格式
            :http://logging.apache.org/log4j/2.x/manual/layouts.html-->
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -
%msg%xEx%n" />
        </Console>
        <!-- 日志信息输出到文件,这个log每次运行程序会自动清空,由append属性决定 -->
        <!-- 有关属性替换:http://logging.apache.org/log4j/2.x/manual/lookups.html
        -->
        <File name="log" fileName="${sys:app.path}log/test.log" append="false">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -
%msg%xEx%n" />
        </File>
        <!--如果文件超过size,则日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档
        -->
        <RollingFile name="RollingFile" fileName="${sys:app.path}logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -
%msg%xEx%n" />
            <SizeBasedTriggeringPolicy size="50MB" />
        </RollingFile>
    </appenders>
    <!--定义logger,只有定义了logger并引入appender,appender才会生效 -->
    <loggers>
        <!--建立默认的root logger -->
        <root level="debug">
            <appender-ref ref="RollingFile" />
            <appender-ref ref="Console" />
        </root>
        <!-- additivity:子Logger 是否继承 父Logger 的 输出源(appender) 的标志位 -->
        <Logger name="com.demo" level="debug" additivity="false">
            <appender-ref ref="Console" />
        </Logger>
    </loggers>
</configuration>

其它日志工具桥接log4j:
在这里插入图片描述

public class Step01 {
private static Log commonsLogger = LogFactory.getLog(Step01.class);
// private static Logger log4j2Logger = LogManager.getLogger(Step01.class);
public static void main(String[] args) {
		commonsLogger.info("commonsLogger....................");
	}
}

标签:精通,入门,Spring,Pivotal,模块,spring,org,日志
From: https://blog.csdn.net/happysmooth/article/details/140277860

相关文章

  • springcloud-注册中心和配置中心
    1注册中心1.1为什么要用注册中心微服务之间会相互调用,假如有两个服务orderService和userService,orderService会调用userService获取当前订单相关的用户信息,且userService部署了多个实例:大家思考几个问题:order-service在发起远程调用的时候,该如何得知user-service实例的ip......
  • springboot星之语明星周边产品销售网站的设计与实现(文档+源码)
    大家好,我是永钊,一个混迹在java圈的码农,今天要和大家聊的是一款基于springboot的星之语明星周边产品销售网站,项目源码请联系永钊,目前有各类成品毕设javawebsshssmspringboot等等项目框架,源码丰富,欢迎咨询。 本网站系统是一个B/S模式系统,采用SpringBoot框架作为后台开......
  • springboot信息化在线教学平台的设计与实现(文档+源码)
    大家好,我是永钊,一个混迹在java圈的码农,今天要和大家聊的是一款基于springboot的信息化在线教学平台,项目源码请联系永钊,目前有各类成品毕设javawebsshssmspringboot等等项目框架,源码丰富,欢迎咨询。 本网站系统是一个B/S模式系统,采用SpringBoot框架,MYSQL数据库设计开发......
  • 谷粒商城学习笔记-2-分布式组件-SpringCloud Alibaba-Nacos注册中心
    文章目录一,Nacos简介1,简介2,Nacos原理剖析二,Nacos服务端安装1,下载nacos-server2,解压启动nacos-server3,验证三,服务注册步骤1,引用Nacas客户端的Jar包2,服务启动类增加注解3,配置Nacos服务器地址四,验证错误记录一,Nacos简介1,简介Nacos是阿里巴巴开源的一个更易于构建云......
  • 基础算法训练题单之排序(从入门到入土)——题解
    A.P1177【模板】排序三种方法:快速排序,归并排序,STL库的sort函数。法一、三:https://www.cnblogs.com/expect-999/p/17594345.html法二:https://www.cnblogs.com/expect-999/p/17599008.htmlB.P1923【深基9.例4】求第k小的数模板题目,直接对数组进行升序排序,如果数组从......
  • 基于SpringBoot+Vue+uniapp的汽车维修预约服务系统的详细设计和实现(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的绿城郑州爱心公益网站的详细设计和实现(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的社团服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Python进阶入门之DataFrame
    引言接上一篇《关于Python中的series详解与应用》。本篇将详细介绍DataFrame,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较。什么是DataFrameDataFrame是Pandas库中的一种二维标签数据结构,可以看作是一种带有行和列标签的表格数据。它既有行索引......
  • C++基础入门语法--代码基础框架
    文章内容概括:了解学习导入头文件、使用usingnamespacestd简化代码、创建程序基础框架、学习使用return(如需要直接复制请到文章最末尾)正文:1.学习导入头文件:    在Dev-C++编辑器中新建文件,在文件的第一行中输入:#include<iostream>    以上代码为C++导入......