SpringMVC设计思想&SpringAOP&JDK/CGlib动态代理

目录

1.MVC设计思想

1.1  Ajax

 1.2  传统Servlet的弊端

1.3   框架之间的调用关系

 1.4  JSON结构

1.4.1 JSON的格式

 1.5 RestFul结构(难点)

1.5.1RestFul参数接收

 1.5.2   RestFul请求路径的通用写法

1.5.3  请求类型的种类

2. "三层"代码结构

2.1 代码结构实现

 3.Spring---AOP

 3.1  业务说明

3.2  AOP中专业术语(难点)

3.3切入点表达式

3.4 导入jar包

 3.5 定义切面类

3.6 让AOP生效

 3.7自定义注解

4.  JDK动态代理

4.1  关于代理模式说明

4.2  JDK动态代理特点

5.  CGlib动态代理

5.1特点说明

5.2 作用

6.  通知方法

6.1  关于通知方法解析

 7.  Spring 总结


 

1.MVC设计思想

M: Model 数据层
V: View 视图层
C: Control 控制层

SpringMVC是Spring基于MVC思想.专门针对于前后端交互的开发的框架.
总结: MVC 主要的目的降低代码的耦合性,提高扩展性.方便后续开发.

1.1  Ajax

  1. Ajax特点: 局部刷新,异步访问!
  2. 什么是同步: 当用户刷新页面时,必须等到所有的页面数据加载回来之后,统一刷新显示.
  3. 什么是异步: 当用户刷新页面是,在内部发起多个请求.页面数据先回来的,则局部页面先刷新展现.
  4. Ajax为什么可以异步: Ajax引擎!!!
  5. watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_16,color_FFFFFF,t_70,g_se,x_16

 1.2  传统Servlet的弊端

传统的Servlet 一个业务方法,需要编辑一个Servlet. 如果业务复杂则导致Servlet数量增多.
Servlet的请求的方式 只能支持 get/post请求.
通过Servlet获取的参数的类型 都是String,需要手动的进行类型转化.
如果编辑servlet 则需要编辑大量的web.xml(8行配置) 文件.

1.3   框架之间的调用关系

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zeq6ICA5aSq6Ziz,size_20,color_FFFFFF,t_70,g_se,x_16

 1.4  JSON结构

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
根源: 网络传输协议http/https,本质传输的数据都是字符串/字节信息. 协议与系统无关. 所以采用JSON的方式将数据按照特定的顺序进行排列. JSON中的特殊的数据结构,可以很好的解析字符串.

1.4.1 JSON的格式

对象格式

对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

c866bb99214248e599fc6d2176b144bc.png

 数组格式

数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zeq6ICA5aSq6Ziz,size_20,color_FFFFFF,t_70,g_se,x_16

  嵌套格式

值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zeq6ICA5aSq6Ziz,size_20,color_FFFFFF,t_70,g_se,x_16

 1.5 RestFul结构(难点)

1.5.1RestFul参数接收

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_17,color_FFFFFF,t_70,g_se,x_16

 1.5.2   RestFul请求路径的通用写法

优化: restFul风格的请求名称的要求,不能出现动词

http://localhost:8080/userById?id=100 类型: GET 查询业务逻辑
http://localhost:8080/userById?id=100 类型: Delete 删除业务逻辑
http://localhost:8080/userById?id=100&name=tomcat 类型: PUT 更新业务逻辑
http://localhost:8080/user 类型: POST 新增业务逻辑

1.5.3  请求类型的种类

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zeq6ICA5aSq6Ziz,size_20,color_FFFFFF,t_70,g_se,x_16

 

2. "三层"代码结构

1. Controller层 主要与页面进行交互 @Controller
2. Service层 主要实现后端的业务逻辑 @Service
3. Dao层/Mapper层 主要与数据库进行交互 也把该层称之为 “持久层” @Repository/@Mapper

2.1 代码结构实现

包名: mapper 类2个 一个接口UserMapper/一个实现类 UserMapperImpl
包名: service 类2个 一个接口UserService/ 一个实现类UserServiceImpl
包名: controller 一个类: UserController
知识说明: 被调用的一般会有接口和实现类

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_19,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_18,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 

 3.Spring---AOP

 3.1  业务说明

事务特性: 1. 原子性 2. 一致性 3.隔离性 4.持久性
业务说明: 在增/删除/修改的操作过程中添加事务控制.

3.2  AOP中专业术语(难点)

1).连接点: 用户可以被扩展的方法
2).切入点: 用户实际扩展的方法
3).通知: 扩展方法的具体实现
4).切面: 将通知应用到切入点的过程

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zeq6ICA5aSq6Ziz,size_20,color_FFFFFF,t_70,g_se,x_16

 

3.3切入点表达式

1 bean(“对象的Id”) 每次拦截,只拦截1个       

 @Pointcut(“bean(userServiceImpl)”) 只匹配ID为userServiceImpl的对象      
2 within(“包名.类名”)

  @Pointcut(“within(com.jt.demo2.service.*)”) 匹配xx.xx.service下的所有对象
3 execution(返回值类型 包名.类名.方法名(参数列表))

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_17,color_FFFFFF,t_70,g_se,x_16
4 @annotation(注解的路径)

 

3.4 导入jar包

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_14,color_FFFFFF,t_70,g_se,x_16

 3.5 定义切面类

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_18,color_FFFFFF,t_70,g_se,x_16

3.6 让AOP生效

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 3.7自定义注解

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 

4.  JDK动态代理

4.1  关于代理模式说明

在业务层不方便做,但是又不得不做的事情,可以放到代理对象中. 通过这样的设计就可以解决业务层耦合的问题. 代理对象看起来和真是的对象 一模一样.所以用户使用不会察觉.

4.2  JDK动态代理特点

  1. 类型名称: class com.sun.proxy.$Proxy9
  2. 要求: 要求被代理者,必须是接口或者是实现类.
  3. JDK代理是java原生提供的API 无需导包.
  4. JDK动态代理在框架的源码中经常使用.

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_19,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_17,color_FFFFFF,t_70,g_se,x_16

 

5.  CGlib动态代理

5.1特点说明

历史原因: JDK动态代理要求必须"有接口",但是某些类它没有接口,则无法使用JDK代理生成代理对象. 所以为了填补知识的空缺,则引入cglib代理.

问题说明: cglib动态代理 要求有无接口都可以创建代理对象. 问题? 如何保证和被代理者"相同"
答案(特点): 要求cglib动态代理继承被代理者.代理对象是被代理者的子类.

5.2 作用

说明1: 一般我们将业务层中的耦合性高的代码,采用动态代理的方式进行解耦.使得程序更加具有扩展性. (业务逻辑的解耦)
说明2: Spring专门针对动态代理的规则.封装了一套API 起名 AOP

6.  通知方法

6.1  关于通知方法解析

1.前置通知 在目标方法执行之前执行.  
2.后置通知 在目标方法执行之后执行.  记录目标方法的返回值
3.异常通知 在目标方法执行之后抛出异常时执行.   抛出的异常信息
4.最终通知 都要执行的通知   记录程序最后的状态

说明: 上述的四大通知一般用于记录程序的运行状态.只做记录.

5.环绕通知 在目标方法执行前后都要执行的通知

环绕通知特点:
     *       1.方法执行前后,通知都要执行.
     *       2.环绕通知可以控制目标方法是否执行.
     *       3.环绕通知必须添加返回值.
     *   2. proceed()
     *      作用1: 如果有下一个通知,则执行下一个通知
     *      作用2: 如果没有下一个通知,则执行目标方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_18,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56eD5aS06ZSF6ZSF,size_20,color_FFFFFF,t_70,g_se,x_16

 7.  Spring 总结

知识总结:
1.Spring的作用: Spring可以整合其它的第三方框架!从架构的角度,实现了代码的松耦合!
2. Spring-IOC/DI IOC控制反转/数据结构Map集合<id,反射实例化对象>/ xml文件写法/注解写法
DI: 依赖注入 类型注入/名称注入/一般接口都是单实现.
3. Spring-AOP 在不修改源码的条件下对方法进行扩展!!!
4. 动态代理 JDK动态/Cglib动态代理 method.invoke()
5. 切面 = 切入点表达式 + 通知方法
6. AOP中因为切面较多,每个切面都完成特定的功能,所以一般不会研究顺序. @Order注解 可有控制顺序.

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值