重生之我在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-core和spring-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模块通过JUnit和TestNG组件支持单元测试和集成测试。它提供了一致性地加载和缓存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装载日志系统的流程如下
- 查找名为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
- 查找名为org.apache.commons.logging.Log的系统属性 。
- 如果Log4J日志记录系统在应用程序类路径中可用,使用相应的包装(Log4JLogger)。
- 如果应用程序在JDK 1.4系统上执行,使用相应的包装器类(Jdk14Logger)。
- 默认的简单日志记录包装器(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