java学习day16

AOP(Aspect Orient Programming)

AOP直译过来就是面向切面编程,AOP是一种编程思想,是面向对象编程 (OOP)的一种补充

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring会自动在业务方法中开启、提交事务,并且在事务处理失败时,执行相应的回滚策略

作用

AOP采用横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理,日志管理,权限控制,异常处理等方面。

主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性

简单地说,AOP的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能

代理模式

为其他对象提供一种代理以控制对这个对象的访问。

在直接访问对象时带来的问题,例如要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,此时可以在访问此对象时加上一个对此对象的访问层

静态代理:

        优点:好理解

        缺点:

                1.代码冗余:当多个被代理类,多个需增强方法的增强内容一样时,代码重复冗余

                2.不易维护:每个被代理类需要专门维护一个代理类,类成倍增加,需增加方法增加时,需要同时维护代理类和被代理类

                接口

                

                被代理类

                

                代理类

                 

                工厂类测试静态代理模式

        ​​​​​​​        

                结果

        ​​​​​​​        

动态代理:

运行时动态的生成类字节码,加载进JVM

        JDK动态代理(组合,被代理类必须实现接口):

                定义并实现接口

        ​​​​​​​                 ​​​​​​​                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

                定义代理处理器,重写接口中的方法

        ​​​​​​​        

                声明代理工厂,使用Proxy.newProxyInstance方法返回代理对象

        ​​​​​​​        

                方法测试

        ​​​​​​​        

                结果

        ​​​​​​​        

        CGLIB动态代理(继承,被代理类不能被final修饰)

SpringAOP的术语

名称

说明

JoinPoint(连接点)

指那些被拦截到的点,在Spring中,指可以被动态代理拦截目标类的方法

PointCut(切入点)

指要对那些JoinPoint进行拦截,即被拦截的连接点

Advice(通知)

指拦截到JoinPoint之后要做的事情,即对切入点增强的内容

Target(目标)

指代理的目标对象

Weaving(植入/织入)

指把增强代码应用到目标上,生成代理对象的过程

Proxy(代理)

指生成的代理对象

Aspect(切面)

切入点和通知的结合

SpringAOP通知分类

通知

说明

before(前置通知)

通知方法在目标方法调用之前执行

after(后置通知)

通知方法在目标方法返回或异常后调用

after-returning(返回后通知)

通知方法会在目标方法返回后调用

after-throwing(抛出异常通知)

通知方法会在目标方法抛出异常后调用

around(环绕通知)

通知方法会将目标方法封装起来

SpringMVC

SpringMVC使用MVC架构模式的思想,将Web应用进行职责解构,把一个复杂的Web应用划分成模型(Model)、控制器(Controller)以及视图(View)三层,有效的简化了Web应用的开发,降低了出错风险,同时也方便了开发人员之间的分工配合

SpringMVC注解

@Controller

可以将一个普通的JAVA类标识成控制器(Controller)类。用于处理客户端发起的请求,并负责返回适当的视图(View)作为响应。在使用该注解的类中,通常需要在方法上使用@ResponseBody注解来指示该方法的返回值要作为响应的主体内容,而不是解析为视图。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@RestController

是一个组合注解,它结合了@Controller和@ResponseBody注解的功能,在使用@RestController注解标记的类,每个方法的返回值都会以JSON或XML的形式直接写入HTTP响应体中,相当于在每个方法上都添加了@ResponseBody注解

(@RestController下的方法默认返回的是数据格式,@Controller注解标注的类下面默认返回的就是以视图为格式)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@RequestMapping

该注解是SpringMVC中最常被用到的注解之一,它通常被标注在控制器方法上,负责将请求与处理请求的控制器方法关联起来,建立映射关系

SpringMVC的前端控制器(DispatcherServlet)拦截到用户发来的请求后,会通过@RequestMapping注解提供的映射信息找到对应的控制器方法,对这个请求进行处理

使用方式:

        修饰方法:

                当该注解被标注在方法上时,value属性值就表示访问该方法的url地址。当用户发送过来的请求想要访问该Controller下的控制器方法时,请求路径就必须与这个value值相同

        修饰类:

                当该注解标注在控制器类上时,value属性的取值就是这个控制器类中的所有控制器方法url地址的父路径。也就是说,访问这个Controller下的任意控制器方法都需要带上这个父路径

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@PathVariable

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@RequestParam

该注解是将请求参数和控制器方法的形参创建映射关系,可以同时接收多个参数

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@Get/Post/Put/DeleteMapping

REST请求资源转换

get

user/1

获取信息

user/get

post

user/1?参数…

新增

user/post

delete

user/1

删除

user/del?id=1

put

user/?参数…

编辑

user/edit

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

拦截器(Interceptor)

是SpringMVC提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前handler、控制器处理完请求后、甚至是渲染视图后执行一些指定的操作

在SpringMVC中,拦截器的作用与Servlet中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。

SpringMVC提供了HandlerInterceptor接口

定义拦截器:

        业务逻辑代码

        配置拦截器        

异常处理

在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。

Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,它可以对控制器方法执行过程中出现的各种异常进行处理。

@ExceptionHandler 注解(局部处理)

Spring MVC 允许我们在控制器类(Controller 类)中通过 @ExceptionHandler 注解来定义一个处理异常的方法,以实现对控制器类内发生异常的处理。

@ExceptionHandler 注解中包含了一个 value 属性,我们可以通过该属性来声明一个指定的异常。如果在程序运行过程中,这个 Controller 类中的方法发生了这个指定的异常,那么 ExceptionHandlerExceptionResolver 就会调用这个 @ExceptionHandler 方法对异常进行处理。

定义在某个控制器类中的 @ExceptionHandler 方法只在当前的控制器中有效,它只能处理其所在控制器类中发生的异常。

@ExceptionHandler 方法的优先级--指定异常类型最精确的

全局异常处理

@ExceptionHandler 方法定义在一个使用了 @ControllerAdvice 注解的类中。使用 @ControllerAdvice 注解的类可以包含多个不同的带有 @ExceptionHandler 注解的方法

请求转发与重定向

请求转发        

        1.通过String类型的返回值实现转发        

        控制器方法指定逻辑视图名(ViewName)时,使用“forward:”关键字进行请求转发操作

        当控制器方法中所设置的逻辑视图名称以“forward:”为前缀时,该逻辑视图名称不会被SpringMVC配置的视图解析器解析,而是会将前缀“forward:”去掉,以剩余部分作为最终路径通过转发的方式实现跳转

        2.通过ModelAndView实现转发

重定向

        1.通过String类型的返回值实现重定向

        2.通过ModelAndView实现重定向

转发:同一个服务器中不同的服务进行转发

           浏览器发送了一个请求,可以转发到项目中受保护的资源WEB-INF

           转发是request对象执行forward方法

重定向:可以在不同的服务之间跳转

              浏览器发送了两次请求

              重定向通过response对象通知浏览器重新访问使用redirect方法

SpringMVC运行原理

1.用户通过浏览器发起一个HTTP请求,该请求会被DispatcherServlet(前端拦截器)拦截。

2.DispatcherServlet调用HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器。

3.HandlerMapping将Handler以HandlerExecutionChain执行链的形式返回给DispatcherServlet。

4.DispatcherServlet将执行链返回的Handler信息发送给HandlerAdapter(处理器适配器)。

5.HandlerAdapter根据Handler信息找到并执行相应的Handler(即Controller控制器)对请求进行处理。

6.Handler执行完毕后会返回HandlerAdapter一个ModelAndView对象(SpringMVC的底层对象,包括Model数据模型和View视图信息)。

7.HandlerAdapter接收到ModelAndView对象后,将其返回给DispatcherServlet。

8.DispatcherServlet接收到ModelAndView对象后,会请求ViewResolver(视图解析器)对视图进行解析。

9.ViewResolver解析完成后,会将View视图返回给DispatcherServlet。

10.DispatcherServlet接收到具体的View视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的View(视图)。

11.视图负责将结果显示到浏览器(客户端)

​​​​​​​
  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值