CGB2110-DAY05-SpringAOP-SpringMVC

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

  1. Ajax特点: 局部刷新,异步访问!
  2. 什么是同步: 当用户刷新页面时,必须等到所有的页面数据加载回来之后,统一刷新显示.
    在这里插入图片描述
  3. 什么是异步: 当用户刷新页面是,在内部发起多个请求.页面数据先回来的,则局部页面先刷新展现.
  4. Ajax为什么可以异步: Ajax引擎!!!
    在这里插入图片描述
  5. 常见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的弊端

  1. 传统的Servlet 一个业务方法,需要编辑一个Servlet. 如果业务复杂则导致Servlet数量增多.
  2. Servlet的请求的方式 只能支持 get/post请求.
  3. 通过Servlet获取的参数的类型 都是String,需要手动的进行类型转化.
  4. 如果编辑servlet 则需要编辑大量的web.xml(8行配置) 文件.
    上述的知识都是历史产物. 后期SpringMVC框架将Servlet进行封装

3.3.2 框架之间的调用关系

在这里插入图片描述

3.3.3 常用注解

  1. @Controller 将该类首先交给SpringMVC进行管理.之后将SpringMVC整体框架 交给Spring管理.
  2. @RequestMapping("/hello") 该路径必须与用户的访问路径一致.如果路径不一致.则会报404异常.
  3. @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 "查询成功!!!";
    }

作业

  1. 整理今天的内容
  2. 提前预习JSON 什么是JSON JSON基本结构 常见JSON格式类型
  3. 预习SpringMVC 参数传递过程 restFul结构!!!

常用注解

  1. @Configuration 标识当前类是配置类
  2. @ComponentScan 包扫描注解 扫描注解
  3. @Bean 标识该方法的返回值交给Spring容器管理
  4. @Scope 控制多例和单例
  5. @Lazy 懒加载
  6. @PostConstruct 初始化方法
  7. @PreDestroy 销毁方法
  8. @Component 将当前类未来的对象交给容器管理
  9. @Autowired 按照类型进行注入
  10. @Qualifier 按照名称进行注入
  11. @Repository 标识持久层注解
  12. @Service 标识Service层
  13. @Controller 标识Controller层
  14. @Value 为属性赋值 @Value("${key}")
  15. @PropertySource 加载指定路径的配置文件properties
  16. @Aspect 标识当前类是一个切面类
  17. @Pointcut 用于定义切入点表达式 表达式写法4种
  18. @EnableAspectJAutoProxy 让AOP的注解有效果
  19. @Before AOP-前置通知
  20. @AfterReturning AOP-后置通知
  21. @AfterThrowing AOP-异常通知
  22. @After AOP-最终通知
  23. @Around AOP-环绕通知
  24. @Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
  25. @ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
  26. @RequestMapping("/hello") 实现浏览器的请求路径与方法的映射
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闪耀太阳

感觉文章不错的记得打赏呀

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

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

打赏作者

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

抵扣说明:

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

余额充值