SpringFramework加强
SpringIOC模块
SpringMVC模块
SpringAOP模块
SpringIOC模块
IOC是一种设计思想,称之为控制反转。基于这种思想实现对象创建,对象的科学管理以及应用时的解耦(借助DI机制实现)。Spring框架核心就是基于这种机制进行了完美实现。
思考:控制反转探讨的是什么?答:谁控制谁的问题,Spring控制对象的创建管理。
思考:生活中的IOC的实现?答:例如股票操盘手,父母包办婚姻。
Spring三大设计思想:IOC/MVC/AOP
SpringBean容器的初始化
思考:如何理解Spring中的Bean对象?答:由Spring管理的对象都是Bean对象。
思考:如何理解Spring中的Bean容器?答:存储Bean对象的容器,可以是Map对象。
思考:我们自己写的类如何交给Spring管理?
答1:通过xml配置文件进行描述,例如<bean id="" class="">
答2:通过annotation方式进行描述,例如@Controller/@Service
思考:Spring中Bean对象的类型?
答1:未实现FactoryBean接口的对象
答2:实现了FactoryBean接口的对象
思考:Spring中如何创建Bean对象?答:借助BeanFactory工厂,基于反射技术创建Bean对象。
思考:Spring管理的Bean对象常用作用域?
答1:Singleton(单例作用域),Bean对象具备全局唯一性。
答2:Prototype(多例作用域),每次获取Bean对象都会创建一个新的实例。
思考:Spring管理的Bean对象是否支持延迟加载?答:支持。
思考:如何自己设计一个IOC容器呢?答:详情请查阅代码。
Spring中Bean容器初始化过程图
IOC_Bean容器(配置文件/工厂/容器/全局访问点)
Spring中的两大Map对象容器
思考:如何理解Spring中的两大Map对象?
答1:一个Map用于存储Bean的配置信息。
答2:一个Map用于存储Bean的实例信息。
Spring中两大类型Bean对象
未实现FactoryBean接口:直接通过反射技术调用构造器创建Bean对象。
实现了FactoryBean接口:调用FactoryBean对象的getObject方法,创建Bean对象。
说明:一般在创建一些相对复杂的工厂对象时,通常会写一个工厂Bean对象,然后基于工厂Bean对象创建具体的工厂对象,例如:SqlSessionFactoryBean/ShiroFilterFactoryBean/ProxyFactoryBean等。
Spring中的两大Bean对象描述方式
xml配置文件方式:<bean id="" class=""></bean>
annotation方式:@Service/@Controller/@Configuration/@Bean...
Spring中Bean对象的依赖注入
DI依赖注入基本概念图
DI依赖注入在项目中的应用实现图
Spring整合MyBatis
Spring整合MyBatis方式1图
Spring整合MyBatis方式2图
SpringMVC模块加强
MVC是一种分层架构设计思想,目的是基于对象职责上的不同,进行分层设计,实现各司其职,各尽所能,以提高代码的可维护性/可扩展性。
SpringMVC中的MVC模块是基于MVC分层软件设计思想的一种完美实现,类似的框架还有Struts2等。
注意:B/S网络系统架构下的单体式JavaEE软件一般采用MVC水平切分
SpringMVC核心架构
SpringMVC模块核心组件对象图
SpringMVC请求响应处理
所有MVC框架的重点都在请求和响应数据的处理上
MVC请求处理
-
请求路径:普通方式/rest风格方式,报错404
-
请求方式:Get请求/Post请求,报错405
-
请求参数:直接量/PO对象/MAP对象,报错400
MVC响应处理
-
响应方式:转发/重定向(redirect)
-
响应数据封装:ModelAndView,Model,Map
-
响应数据转换:将对象序列化为JSON格式字符串
注意:如果将响应数据转换为JSON格式字符串,将不调用ViewResover视图解析器对象
SpringMVC拦截器对象
拦截器是项目中的一种通用组件,通常可以在某个对象执行之前或之后做一些预处理操作,可以将其看成是一种特殊的过滤器。
SpringMVC拦截器对象图
需求:通过拦截器限定系统的登录时间
说明:在项目中自己编写SpringMVC拦截器
编写类实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类;
配置拦截器<mvc:interceptors/>,拦截器的执行顺序与配置顺序相关。
SpringMVC异常处理
项目中异常的处理方式及规则
-
异常捕获:try{}catch{},日志输出
-
继续抛出:数据层抛给业务层,业务层再继续抛给控制层,但是异常传递要占用资源,对性能会有一定影响,所以异常能处理则处理,处理不了则继续抛出。
SpringMVC异常处理图
SpringMVC中对异常处理的手段有两种:
-
直接在控制层方法中处理异常:处理异常的方法使用@ExceptionHandler修饰,并指定具体可以处理的异常类型。
-
定义全局异常处理类,在此类中对异常信息进行封装和转换。
说明:当Controller类中定义了局部异常处理方法,在全局异常处理类中也定义了同样的异常处理方法,那就遵循局部优先规则。
SpringAOP模块
AOP是一种面向切面的程序设计思想,基于这种思想可以动态为对象添加扩展功能设置控制对象的执行,Spring框架中对这种思想做了一个完美的实现。
SpringAOP动机
Spring框架中可以基于AOP实现对目标对象的控制以及功能的扩展:
SpringAOP对象调用图
例如:SpringAOP在项目中要实现的功能
SpringAOP原理实现
SpringAOP原理分析
-
目标对象实现了接口则采用JDK动态代理控制目标对象
-
目标对象未实现接口则采用Cglib代理控制目标对象
SpringAOP案例分析
项目中的日志管理:基于JDK动态代理实现目标对象控制及功能扩展
SpringAOP日志切面原理图
SpringAOP其他案例实现
SpringAOP底层代理对象创建及应用分析
JDK动态代理原理图
Cglib代理原理图
SpringAOP相关术语
切面(Aspect):封装了扩展功能的对象。
通知(Advice):封装了扩展功能及目标方法调用的一个切面方法。
包括:@Around,@Before,@After,@AfterReturning,@AfterThrowing
连接点:JointPoint,ProceedingJoinPoint(泛指一个目标方法)。
切入点:Pointcut(泛指多个目标方法的集合)。
说明:了解常用的切入点表达式
-
bean(*ServiceImpl)
-
@annotation(com.db.common.annotation.RequiredLog)
-
...