Spring原理与应用
1. Spring的特性
Spring基于J2EE技术实现了一套轻量级的Java Web Service系统应用框架。它有很多优秀的特性,具体如图所示。
2. Spring的模块
Spring是模块化的,允许应用按需引入各个模块。常用的核心模块有核心容器层(Core Container)、数据访问层(Data Access)、Web应用层(Web Access)。除此以外,Spring还包括Test、AOP、Aspects等其他模块,具体如下图所示。
相关概念
- 依赖注入
所谓依赖注入,是指在一个Bean实例中引用另外一个Bean实例时,Spring容器会自动创建其所依赖的Bean实例,并将该实例注入(传递)到对应的Bean中。- JDBC
Java Data Base Connectivity(Java数据库连接)- JMS
Java Message Service(Java消息服务)- SpEL
Spring Expression Language(Spring表达式语言)- AOP
AOP模块提供了面向切面的编程实现,允许应用程序通过定义方法拦截器和切入点来实现系统功能和业务功能之间的解耦。- Aspects
Aspects模块提供了Spring与AspectJ的集成,是一个面向切面编程的模块。- Test
Test模块用于对JUnit或TestNG等测试框架提供支持,用来实现Spring代码的自动化测试。
3. Spring的注解
Spring注解将应用程序中Bean的定义和Bean之间复杂的依赖关系的配置从XML配置中解放出来,应用程序只需在需要某些服务或者功能时,使用注解依赖注入即可,具体Bean的定义和依赖关系有Spring的自动装配来完成。这使得Spring的使用更加方便。
3.1 Spring注解的使用
1. 导入命名空间及规范
在Spring的application.xml配置文件中导入命名空间及规范。
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"
2. 配置扫描包
在applicationContext.xml中配置需要扫描的包。下面的代码开启了类实例自动扫描的功能,但只有在指定的包中使用注解才能够生效。
<!-- 指定Spring IoC容器扫描的包-->
<context:component-scan base-package="com.alibaba.spring">
</context:component-scan>
3. 使用注解
直接在Java类中按注解的正常方式使用即可。
4. Spring IoC原理
简介
Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java的反射功能实例化Bean并建立Bean之间的依赖关系。
4.1 Spring Bean的装配流程
Spring在启动时,会从XML配置文件或注解中读取应用程序提供的Bean的配置信息,并在Spring容器中生成一份相应的Bean配置注册表;然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层业务提供基础的运行环境。其中,Bean的缓存池为HashMap实现。Spring的装配流程如图所示。
5. Spring AOP原理
5.1 简介
AOP简介
Spring AOP通过面向切面技术将与业务无关却为业务模块所共用的逻辑代码封装起来,以提高代码的复用率,降低模块之间的耦合度。
Spring AOP将应用分为核心关注点和横切关注点两个部分。
5.2 AOP的两种代理方式
Spring提供了JDK和CGLib两种方式来生成代理对象,具体生成代理对象的方式由AopProxyFactory根据AdvisedSupport对象的配置来决定。
Spring默认的代理对象生成策略为:如果是目标类接口,则使用JDK动态代理技术,否则使用CGLib动态代理技术。
关于CGLib动态代理
CGLib(Code Generation Library),它是一个高性能的代码生成类库,可以在运行期间扩展Java类和实现Java接口。CGLib包的底层通过字节码处理框架ASM来实现,通过转换字节码生成新的类。
CGLib动态代理和JDK动态代理的区别
JDK只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则只能通过CGLib创建动态代理来实现。
6. Spring MVC原理
6.1 工作流程
Spring MVC的工作流程如下图所示。
1. 客户端发起HTTP请求
客户端将请求提交到DispatcherServlet。
2. 寻找处理器
DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理该请求的Controller。
3. 调用处理器
DispatcherServlet将请求提交到Controller。
4. 调用业务处理逻辑并返回结果
Controller调用业务处理逻辑后,返回ModelAndView。
5. 处理视图映射并返回模型
DispatcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图。
6. HTTP响应
视图负责将结果在客户端浏览器上渲染和展示。