AOP术语
-
target:目标类,即需要被代理的类。例如:UserService
-
Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
-
PointCut切入点︰已经被增强的连接点。例如: addUser()
-
advice通知/增强,增强代码。例如: after、before
-
Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
-
proxy 代理类
-
Aspect(切面):是切入点pointcut和通知advice的结合
常见的通知 五种Advice
- 前置通知:在我们执行目标方法之前运行(@Before)
- 后置通知:在我们目标方法运行结束之后,不管有没有异常(@After)
- 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
- 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
- 环绕通知:动态代理,需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知,执行之后就相当于我们后置通知(@Around)
excution表达式
-
excution(
- 修饰符 pattern
- 返回值 pattern
- 描述包名
- 方法名(参数)
- 方法抛出异常 pattern
)
实例:
@Pointcut("execution(* com.onlylmf.controller.*.*(..))")
public void log() {}
Java日志
-
日志: 保存描述系统运行状态的信息
-
日志框架: 能实现日志输出的工具包
-
日志框架的功能: 定制输出目标、格式、选择性输出
-
常见的日志框架:
- 日志门面: 是日志实现的抽象层: 如JCL、SLF4j
- 日志实现: 具体的日志功能的实现: 如JUL、log4j、log4j2、logback
-
slf4j是Java的一个日志门面,实现了日志框架一些通用的api;
-
logback是具体的日志框架。它和log4j是同一个作者,他是为了解决log4j存在的问题而开发的新的日志框架。
-
slf4j和logback可以简单的看作jdbc和其具体数据库的JDBC的jar包的关系。
-
推荐使用slf4j,而不是直接使用logback。
系统默认只打印info级别以上的日志
测试:
在配置中配置等级信息 配置输出debug级别以上的日志
测试
也可以使用lombok插件 在使用中加入注解@Slf4j
log.info("这是info级别的日志");
log.debug("这是debug级别的日志");
log.error("这是error级别的日志");
效果是一样的 而且不用实现
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/save")
@ResponseBody
public R save(Pets pets, @RequestParam("imageFile")MultipartFile file, HttpServletRequest request)throws Exception {
// System.out.println(file);
JSONObject json = new JSONObject();
if (!file.isEmpty()) {
String filePath = "E:/idea/springBoot/pet_adoption/src/main/resources/static/picture/";//上传到这个文件夹
java.io.File file1 = new java.io.File(filePath);
if (!file1.exists()) {
file1.mkdirs();
}
// 获取图片的名字
String fileName = file.getOriginalFilename();
// 防止图片名字相同而出现bug,使用 uuid 加密
String hToken = UUID.randomUUID().toString();
// 加密后的图片名字:uuid + 图片名字
String HeadName = hToken + fileName;
//System.err.println("HeadName" + HeadName);
String finalFilePath = filePath + HeadName;
pets.setPetPictures(finalFilePath);
java.io.File desFile = new File(finalFilePath);
if (desFile.exists()) {
desFile.delete();
}
try {
file.transferTo(desFile);
pets.setPetPictures(HeadName);
json.put("code", 0);
} catch (Exception e) {
System.out.println(e.getMessage());
json.put("code", 1);
}
}
pets.setPetsTime(new Date());
petsService.addPets(pets);
return R.ok();
}
}