在本系列笔记之前,已经看过极客学院上所有的免费版spring教程视频,极客学院上的视频短,但实在不够系统性,学习过程显得十分的零碎,因此效果是不太好的,这也是重新学习的重要原因。
Spring的简介
spring是一款诞生于2003年的轻量级开源框架,其诞生之初是为了解决企业级应用开发的复杂性,它的主要优势之一就是分层架构,分层设计架构允许开发者选择性使用组件。Spring的核心是控制反转(IOC)和面向切面(AOP)。
使用Spring的好处
- 方便解耦,简化开发
通过Spring提供的IOC容器,可以将对象之间的依赖关系交由Spring来管理,避免硬编码导致的程序之间过度的耦合,开发者无需再为单例模式类、属性文件解析等这些底层的需求所累,从而集中精力于业务逻辑。 - AOP编程的支持
Spring提供了AOP功能的支持,方便用户实现面向切面的编程 - 声明式事务的实现
开发者无需再为事务的管理浪费大量的精力。仅仅通过配置文件,即可完成对事务的管理,无需手动硬编码。 - 方便程序的测试
可以使用非容器依赖的编程方式进行几乎所有的测试工作,例如,spring对Junit的支持使得开发者可以使用注解即轻松的完后测试。 - 方便集成各种开源框架
Spring非但不排斥各种优秀的开源框架,其内部还直接提供了对它们的支持,例如Struts、Hibernate、Mybatis等等。
Spring的结构
Spring框架由多达1400多个类组成,但笼统地来说,其框架可以按功能分为5个主要模块:
以上是Spring官方给出的体系架构图
其中AOP、Aspects、Instrumentation、Messaging可以笼统地算作AOP模块。Core容器中则包含了实现IOC所需的模块,IOC和AOP是Spring框架的根本所在,在此基础上,Spring整合了大量优秀的企业应用开源框架以及第三方类库。Spring的独到之处在于:开发者拥有极大的自主权,在针对不同领域的业务需求上,Spring往往提供了多个可供实现的方案。
- IoC
Spring核心模块实现了IoC的功能,它将类与类之间的依赖从代码中剥离出来,转而以配置文件的方式来描述对象之间的依赖关系,由IoC容器来管理依赖类之间的创建、拼接、管理、获取等工作,BeanFactory是Spring框架的核心接口,实现了其众多的核心功能。
Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了i18n国际化、Bean生命周期控制、框架事件体系、资源加载透明化等等诸多功能。
表达式语言是(EL)一个扩展的一个扩展,用于管理和查询运行期对象,支持获取和设置对象属性,调用对象方法,操作数组、集合等。还提供逻辑运算、变量定义等功能。 - AOP
AOP是OOP以来,影响最大的一项编程设计思想。Spring提供了满足AOP Alliance规范的实现,此外还整合了AspectJ这种语言级的AOP框架。 - 数据访问与集成
任何应用程序的核心问题都是对数据的访问和操作。数据由许多表现形式,如数据表、XML、消息等,而每种数据形式可以有不同的访问技术(如数据表的访问,可以直接使用JDBC,也可以借助Hibernate、Mybatis等框架)。
Spring站在DAO的抽象层面,建立了一套面向DAO层统一的异常体系,同时将各种数据访问时的检查时异常转换为非检查时异常,为整合各种持久层框架提供基础。其次Spring通过模块化技术,对各种数据访问技术进行了薄层封装,将模式化的代码隐藏起来,使数据访问的代码极大简化。这样,Spring就建立起了和数据形式及访问技术无关的统一的DAO,借助AOP技术的实现,Spring提供了声明式事务的管理。 - Web
该模块建立在ApplicationContext之上,提供了Web应用的各种工具类,如通过Listener或Servlet初始化Spring容器,将Spring容器注册到Web容器中。其次,该模块还提供了很多面向Web的功能,如透明化文件上传,Velocity、FreeMarker、XSLT的支持。此外,Spring可以整合Struts、WebWork、Tapestry Web等MVC框架。
Spring提供了一个类似于Struts的MVC框架,成为Spring MVC。据说,Spring之所以也提供一个MVC框架,是因为Rod Johnson想证明实现MVC其实很简单。当然不用Spring MVC也是可以的。
实例 hello world
Spring相关依赖,依然借助maven
<!-- 日志配置 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.0</version>
</dependency>
<!-- Spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
配置文件
其命名没有明确规则,我命名为applicationContext,如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="user" class="edu.tj.entity.User"></bean>
</beans>
下面测试:
public class Test {
@org.junit.Test
public void test(){
//1. 创建容器对象
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.容器实例化对象
User u= (User) ctx.getBean("user");
//3.打印hello world
u.sayHello();
}
hello world
完成。
//TO BE CONTINUED