1.Spring中的AOP
1.1 最终通知
说明: 最终通知,不管方法执行是否有误.则都会执行该通知方法.
//最终通知
@After("pointcut()")
public void after(){
System.out.println("我是最终通知方法!!!");
}
1.2 环绕通知
/**
* 环绕通知:
* 1.特点:
* 1.方法执行前后,通知都要执行.
* 2.环绕通知可以控制目标方法是否执行.
* 3.环绕通知必须添加返回值.
* 2. proceed()
* 作用1: 如果有下一个通知,则执行下一个通知
* 作用2: 如果没有下一个通知,则执行目标方法
*/
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知开始!!!");
Object result = joinPoint.proceed();
System.out.println("环绕通知结束!!!");
return result;
}
1.3 Spring中的通知总结
第一类: 记录程序的运行状态
1. 前置通知
2. 后置通知 记录目标方法的返回值!!!
3. 异常通知 记录目标方法执行之后,抛出的异常信息.
4. 最终通知 记录程序最后的状态.
第二类:
5. 环绕通知 控制目标方法是否执行. 环绕通知是未来使用最多的,功能最为强大的.
1.4 Spring中AOP案例
需求1: 需要对方法的执行时间,进行监控?
通知的选择: 首选环绕通知
需求2: 利用AOP可以实现缓存控制
通知类型: 环绕通知
业务思路:
1. 用户直接查询缓存,
如果缓存中没有数据 表示第一次查询,让目标方法执行.
如果缓存中有数据. 表示第N次查询.目标方法不执行.从缓存中获取数据即可.
需求3: 利用AOP控制事务.
通知类型: 环绕通知
需求4: 利用AOP控制方法的权限!
通知类型: 环绕通知
业务思路:
1. 在AOP的环绕通知中,判断当前用户是否有权限!
2. 有权限: 可以执行目标方法. 获取数据
3. 没有权限: 不能执行目标方法.通知用户 没有权限!!!
关于AOP现状说明: 一般工作中很少直接编辑AOP底层代码.绝大部分的业务逻辑都是使用的高级API不需要从底层写起…
1.5 Spring中AOP的执行顺序
1.5.1 编辑第二个AOP测试类
说明: 编辑第二个AOP测试类
package com.jt.demo2.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component //将当前类.交给Spring容器管理
@Aspect //标识AOP
public class SpringAOP2 {
@Around("@annotation(com.jt.demo2.anno.CGB2110)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知开始2");
Object result = joinPoint.proceed();
System.out.println("环绕通知结束2");
return result;
}
}
1.5.2 AOP执行顺序说明
说明: 如果有多个环绕通知,其中的执行的顺序是嵌套关系.
控制顺序:
2. 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注解 可有控制顺序.
3. SpringMVC
3.1 Axios学习
3.1.1 准备工作
说明: 将课前资料中的vue/js目录 粘贴复制到该位置.
3.1.2 Ajax
- Ajax特点: 局部刷新,异步访问!
- 什么是同步: 当用户刷新页面时,必须等到所有的页面数据加载回来之后,统一刷新显示.
- 什么是异步: 当用户刷新页面是,在内部发起多个请求.页面数据先回来的,则局部页面先刷新展现.
- Ajax为什么可以异步: Ajax引擎!!!
- 常见Ajax API jQuery/axios 让ajax调用变得简洁.
3.1.2 Axios 入门案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Axios入门案例</title>
</head>
<body>
<!-- 1.导入js文件 -->
<script src="js/axios.js"></script>
<!-- 2.编辑JS代码 -->
<script>
//url地址: http://localhost:8080/findUser get/post
let url1 = "http://localhost:8080/findUser"
//语法: axios.get(url地址,传递的参数)
axios.get(url1)
.then(function(promise){
console.log(promise.data)
})
/* axios.get(url1)
.then((res) => {
}) */
</script>
</body>
</html>
3.2 SpringMVC 入门案例
3.2.1 创建项目
2.勾选web
3. 启动测试 测试8080端口是否正常启动
3.2.2 SpringMVC入门案例
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody //返回值统一为特定字符串
public class UserController {
@RequestMapping("/hello")
public String hello(){
return "您好,SpringMVC";
}
}
3.2.3 页面效果展现
3.3 SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
总结: SpringMVC是Spring基于MVC思想.专门针对于前后端交互的开发的框架.
3.3.1 传统Servlet的弊端
- 传统的Servlet 一个业务方法,需要编辑一个Servlet. 如果业务复杂则导致Servlet数量增多.
- Servlet的请求的方式 只能支持 get/post请求.
- 通过Servlet获取的参数的类型 都是String,需要手动的进行类型转化.
- 如果编辑servlet 则需要编辑大量的web.xml(8行配置) 文件.
上述的知识都是历史产物. 后期SpringMVC框架将Servlet进行封装
3.3.2 框架之间的调用关系
3.3.3 常用注解
- @Controller 将该类首先交给SpringMVC进行管理.之后将SpringMVC整体框架 交给Spring管理.
- @RequestMapping("/hello") 该路径必须与用户的访问路径一致.如果路径不一致.则会报404异常.
- @ResponseBody 表示该方法的返回值都是JSON串结构,如果返回值为String类型,则原数据返回.
3.4 SpringMVC–简单参数传递
3.4.1 需求说明
常识: 通过浏览器的地址栏 只能发起GET请求.
URL1: http://localhost:8080/findUserById?id=1
难点: 动态接收请求/参数ID
3.4.2 编辑UserController
/**
* 需求: 根据ID 查询user数据.
* URL地址: http://localhost:8080/findUserById?id=1
* 参数: id=1
* 返回值:
* 1.返回String类型 查询成功!!
* 2.返回User对象
* 知识点:
* 1.springmvc为了简化取值过程 可以直接添加参数,源码如下
*/
@RequestMapping("/findUserById")
public String findUserById(int id){
System.out.println("获取用户的ID值:"+id);
return "查询成功!!!";
}
/*public String findUserById(HttpServletRequest request){
//springmvc整合servlet之后的源码
String id = request.getParameter("id");
int intId = Integer.valueOf(id);
System.out.println("获取用户的ID值:"+id);
return "查询成功!!!";
}*/
3.5 SpringMVC–对象方式接收参数
3.5.1 需求说明
需求: URL地址: http://localhost:8080/findUserById?id=1&name=张三&age=18
特点说明: 用户一次性传递了多个参数
3.5.2 封装实体对象
package com.jt.pojo;
import java.io.Serializable;
//注意事项: 1.必须使用包装类型 2.必须添加get/set方法 3.必须序列化
public class User implements Serializable {
private Integer id; //默认值为null 基本类型int 默认值0
private String name;
private Integer age;
private String sex;
//补get/set方法 插件搞定
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
3.5.3 UserController 接收数据
/**
* 多个参数传递问题
* URL: http://localhost:8080/findUser?id=1&name=张三&age=18
* 参数: id=1&name=张三&age=18
* 返回值: String 查询成功
*/
@RequestMapping("/findUser")
public String findUser(User user){
System.out.println(user);
return "查询成功!!!";
}
作业
- 整理今天的内容
- 提前预习JSON 什么是JSON JSON基本结构 常见JSON格式类型
- 预习SpringMVC 参数传递过程 restFul结构!!!
常用注解
- @Configuration 标识当前类是配置类
- @ComponentScan 包扫描注解 扫描注解
- @Bean 标识该方法的返回值交给Spring容器管理
- @Scope 控制多例和单例
- @Lazy 懒加载
- @PostConstruct 初始化方法
- @PreDestroy 销毁方法
- @Component 将当前类未来的对象交给容器管理
- @Autowired 按照类型进行注入
- @Qualifier 按照名称进行注入
- @Repository 标识持久层注解
- @Service 标识Service层
- @Controller 标识Controller层
- @Value 为属性赋值 @Value("${key}")
- @PropertySource 加载指定路径的配置文件properties
- @Aspect 标识当前类是一个切面类
- @Pointcut 用于定义切入点表达式 表达式写法4种
- @EnableAspectJAutoProxy 让AOP的注解有效果
- @Before AOP-前置通知
- @AfterReturning AOP-后置通知
- @AfterThrowing AOP-异常通知
- @After AOP-最终通知
- @Around AOP-环绕通知
- @Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
- @ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
- @RequestMapping("/hello") 实现浏览器的请求路径与方法的映射