一AOP
1 概述
是一个面向切面编程的思想,补充了OPP的不足
实现的效果:对方法的增强,本质上就是在方法执行前后添加功能
经典使用场景:统计性能分析(类与方法,加载的时间)/权限管理/日志/缓存..
好处:使程序员更专注代码业务本身
切面:本质上就是一个类
通知:本质上就是一个方法,定义一些功能
切点:指定哪些类,那些方法要通知的类
常用AOP注解
@Aspect:表示这是一个切面类
@Before:表示是一个前置通知
@After:表示是哟个后置通知
@Around:表示是一个环绕通知
@Ponincut:表示切点
2 步骤
添加Jar包
<!--添加aop依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
在Service层中添加AopAspect类
package cn.tedu.service;
//标记这是一个Aop的类
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;
@Aspect//标记着这是一个aop的类:切面(由切点组成)
@Service//ioc
public class AopAspect {
//切点(指定具体要用通知的类或者方法)
//切点表达式:*是通配符 ..表示0~n个
//方法的返回值/包路径/子包/类名/方法名/参数列表
@Pointcut("execution( * cn.tedu.service..*.*(..))")//service 包中的使用类,所有方法
public void point(){}
//2 通知(是一个方法自定义功能)
@Around("point()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//及时
long start = System.currentTimeMillis();
Object o = joinPoint.proceed();//去执行你的业务方法 //执行所有的方法
long end = System.currentTimeMillis();
long sj = end - start;
System.out.println("方法的执行时间为" + sj);
return o;
}
}
二,Ajax
1 概述
全程 异步的js and xml
好处:异步访问,局部刷新
2 步骤
导入vue.js与axios.js
编写HTML代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="axios.min.js" type="text/javascript"> <!-- 方便发出ajax请求,异步访问,局部刷新-->
</script>
<script src="vue.js" type="text/javascript">
</script>
</head>
<body>
<!-- 2 准备数据渲染区 -->
<div id="app">
{{info}}<!-- 准备数据渲染区,利用插值表达式获取值 -->
</div>
<script type="text/javascript">
new Vue({
el:"#app",//挂载点
data:{//数据区
info:'',
},
mounted:function(){//发起ajax请求
//axax访问服务器的数据
axios.get("http://localhost:8080/car/get").then(
//处理返回值 箭头语法,a表示服务器返回的数据
a => (this.info = a.data)//data与上面的data不一样,上面的data为数据区,而a.data ajax为返回的值
)
},
})
</script>
</body>
</html>
修改服务器的Controller代码
在Controller层添加一个注解.@CrossOrigin//方向JS的请求-跨域的解决方案
package cn.tedu.controller;
import cn.tedu.pojo.Car;
import cn.tedu.service.CarServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//完成了ioc
@RequestMapping("car")
@CrossOrigin//放行JS的请求
public class CarController {
@Autowired
private CarServiceImpl carService;//想用那个类,就把那个类di过来 //注入接口还是注入实现类呢? 为了通用 因为实现类或许只重写一部分代码,而接口是最全的`
@RequestMapping("get")
public Car get1(){
/* Car car = new Car("保时捷", "红色", 5000.50);*/
//去找service层找数据
return carService.get();
}
}
测试: