day-05 aop 以及mvc的基础搭建

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. 在这里插入图片描述
  1. 什么是异步: 当用户刷新页面是,在内部发起多个请求.页面数据先回来的,则局部页面先刷新展现.
  2. Ajax为什么可以异步: 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 创建项目在这里插入图片描述

在这里插入图片描述 

 在这里插入图片描述

 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 "查询成功!!!";
    }

常用注解
@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") 实现浏览器的请求路径与方法的映射
————————————————
版权声明:本文为CSDN博主「闪耀太阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16804847/article/details/122165247

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值