今天内容: 全是狠活,得背
一、Spring两大核心
1.IOC 与 DI
思想:IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件xml/注解即可,完全不用考虑对象是如何被创建出来的。
IoC 是一个概念,是一种思想,其实现方式多种多样。Spring 框架使用依赖注入(DI)实现 IoC
定义: DI—Dependency Injection ,即 “ 依赖注入 ”。依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
通常,依赖注入可以通过三种方式完成,即:构造函数注入,setter 注入,接口注入。在 Spring Framework 中,仅使用构造函数和 setter 注入。
Spring IOC 作用:管理项目中的Java bean的生命周期
为什么需要:在项目运行阶段,程序中需要很多对象来完成整体业务
容器和代码之间的代码控制权反转,代码中不需要明文调用来方法得到对象, 只需要声明该类需要什么类型的对象即可
2.AOP
AOP:面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术
AOP的作用
AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入(拦截器---切入点),增强代码的可读性和可维护性。
简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。
Spring AOP的术语
名称 | 说明 |
Joinpoint (连接点) | 指那些被拦截到的点,在 Spring 中,指可以被动态代理拦截目标类的方法。 |
Pointcut (切入点) | 指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。 |
Advice(通知) | 指拦截到 Joinpoint之后要做的事情即对切入点增强的内容。 |
Target (目标) | 指代理的目标对象。 |
Weaving (植入) | 指把增强代码应用到目标上,生成代理对象的过程 |
Proxy (代理) | 指生成的代理对象 |
Aspect (切面) | 切入点和通知的结合。 |
- Spring AOP 通知分类
通知 | 说明 |
before (前置通知) | 通知方法在目标方法调用之前执行 |
after (后置通知) | 通知方法在目标方法返回或异常后调用 |
after-returning (返回后通知) | 通知方法会在目标方法返回后调用 |
after-throwing (抛出异常通知) | 通知方法会在目标方法抛出异常后调用 |
around (环绕通知) | 通知方法会将目标方法封装起来 |
定义切点
通过execution函数来定义切点
语法:execution(访问修饰符 返回类型 方法名 参数 异常)
具体事例说明:(..):表示方法参数列表,其中..表示任意数量和类型的参数。
匹配所有类public方法:execution(public * *(..))第一个*表示返回值 ..表示任意个任意类型的参数
匹配指定包下所有类所有方法: execution(* cn.xxx.dao.*.*(..)) 第一个想*表示忽略权限和返回值类型
匹配指定包下所有类所有方法:execution(* cn.xxx.dao..*(..))包含子包
匹配指定类所有方法: execution(* cn.xxx.service.UserService.*(..))
匹配实现特定接口所有类方法 : execution(* cn.xxx.dao.GenericDAO+.*(..))
匹配所有save开头的方法: execution(* save*(..))
匹配某个指定的方法: execution(* com.yh.dao.StudentService.save(..))
二、代理模式
1.静态代理
三、 拦截器
1.拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前handler、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。
//正常执行业务逻辑
//作用是调用被代理对象的实际方法,但并不是调用被代理对象的所有方法。它只会调用当前被拦截的方法。
result = method.invoke(proxyedObj, args);
2.在 Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。
四、springmvc 运行原理
Spring MVC 使用 MVC 架构模式的思想,将 Web 应用进行职责解构,把一个复杂的 Web 应用划分成模型(Model)、控制器(Contorller)以及视图(View)三层,有效地简化了 Web 应用的开发,降低了出错风险,同时也方便了开发人员之间的分工配合
用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;
DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器,
HandlerMapping将Handler以 HandlerExecutionChain 执行链的形式返回给 DispatcherServlet。
DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(即 Controller 控制器)对请求进行处理;
Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC 的底层对象,包括 Model 数据模型和 View 视图信息);
HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
ViewResolver 解析完成后,会将 View 视图并返回给 DispatcherServlet;
DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
视图负责将结果显示到浏览器(客户端)。