超级全超级牛逼的文档
《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】
每一次请求都是单独的线程。
ThreadLocal 并不是一个Thread,而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
写员工管理类:看管理端接口写,用PostMapping或GetMapping或Putmapping注解看接口,注解里面写什么路径也是来看接口,前面@RequestMapping("/xx/xx")路径已经写过则只用写最后面没有写过的就行。正常操作调用employeeService.方法();然后Create method 'update'in 'Employeeservice,然后EmployeeServiceImpl实现类中重写该方法,同样进行一系列操作,返回结果语句都是return Result.success();括号里面写什么具体看Result泛型里面定义的是什么,没有定义泛型就不用写。
比如下面:
解析注解 blog.csdn.net/zen99t/arti…
反射(非常重要)通过反射的方式获取这些点的状态和信息。 blog.csdn.net/sinat_38259…
[SpringBoot]自定义注解@AutoFill,实现公共字段自动填充(避免重复对时间属性初始化
自定义切面,实现公共字段自动填充处理逻辑 ①定义切入点,即统一拦截加入了AutoFill 注解的方法 ②编写前置通知,进行公共字段自动填充 获取到当前被拦截的方法上的数据库操作类型 获取到当前被拦截的方法的参数--实体对象 准备赋值的数据 根据当前不同的操作类型,为对应的属性通过反射来赋值
原文链接: blog.csdn.net/qq_62015542…
浅谈Spring中的JoinPoint MethodSignature Signature
AOP 中,切面可以通过 JoinPoint 对象获取到连接点的相关信息,其中包括方法签名信息。
通过 JoinPoint 对象的 getSignature() 方法获取到 Signature 对象。 如果连接点是一个方法,那么可以将 Signature 对象转换为 MethodSignature 对象,通过 MethodSignature 对象可以获取到更加详细的方法签名信息,比如方法返回类型、参数类型等。
怎么操作呢
就是点Signature,ctrl+b进去 然后点住Signature方法,ctrl+h进去,选中MemberSignature (org.aspectj.lang.reflect)
复制粘贴过来替换掉Signature ,进行一波向下转型的操作,
全用到这篇文章里面的:
自定义注解@AutoFill,实现公共字段自动填充
笔记全在项目代码里面 比较重要且难
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
/**
* 切入点:对哪些类的哪些方法进行拦截
* ①定义切入点,即统一拦截加入了AutoFill 注解的方法
*/
//*.*(..)表包里面所有的类所有的方法
// @Pointcut里面写的是对哪些方法进行拦截,要满足2点:①必须是mapper下的所有类的方法,②还要有AutoFill这个注解。
@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void autoFillPintCut(){
}
/**
* 前置通知 在通知中进行公共字段的赋值
* @param joinPoint
*/
@Before("autoFillPintCut()")
public void autoFill(JoinPoint joinPoint){
log.info("开始进行公共字段自动填充...");
/*
AOP 中,切面可以通过 JoinPoint 对象获取到连接点的相关信息,其中包括方法签名信息。
过 JoinPoint 对象的 getSignature() 方法获取到 Signature 对象。
如果连接点是一个方法,那么可以将 Signature 对象向下转型为 MethodSignature 对象,
通过 MethodSignature 对象可以获取到更加详细的方法签名信息,比如方法返回类型、参数类型等。
怎么操作呢
就是点Signature ctrl+b进去 然后点住Signature方法,ctrl+h进去,选中MemberSignature (org.aspectj.lang.reflect)
复制粘贴过来替换掉Signature ,进行一波向下转型的操作,
*/
//1.获取到当前被拦截的方法上的数据库操作类型(比如是Insert还是Update,不同的类型需要给不同的参数赋值)
MethodSignature signature = (MethodSignature) joinPoint.getSignature();//通过连接点对象来获取签名,向下转型为MethodSignature
AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
OperationType operationType = autoFill.value();//获得数据库操作类型(Insert or Update)
//2.获取到当前被拦截的方法的参数--实体对象(比如传入的参数是员工还是菜品还是其它的)
Object[] args = joinPoint.getArgs();
//为防止空指针出现
if(args == null || args.length == 0){
return;
}
Object entity = args[0];
//3 .准备赋值的数据(给公共字段赋值的数据,比如时间就是系统时间,用户ID是从ThreadLocal获取
LocalDateTime now = LocalDateTime.now();
Long currentId = BaseContext.getCurrentId();
//4.根据当前不同的操作类型,为对应的属性通过反射来赋值
//这里注意首字母大小写啊 不要搞反
if(operationType == OperationType.INSERT){
try {
//调用什么对象 形参是什么 返回什么
Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);//时间
Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);//人
Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);//时间
Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);//人
//4.根据当前不同的操作类型,为对应的属性通过反射来赋值
setCreateTime.invoke(entity,now);
setCreateUser.invoke(entity,currentId);
setUpdateTime.invoke(entity,now);
setUpdateUser.invoke(entity,currentId);
} catch (Exception e){
e.printStackTrace();
}
}else if(operationType == OperationType.UPDATE){
try {
//这里是更新 把上面的复制下来 去除新增操作就行
Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);//时间
Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);//人
//4.根据当前不同的操作类型,为对应的属性通过反射来赋值
setUpdateTime.invoke(entity,now);
setUpdateUser.invoke(entity,currentId);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
在阿里云上申请一个oss(Object Storage Service) 即对象存储服务,阿里云上有7天试用期.在黑马java web2023版148,149两集能学到。
String uuid = UUID.randomUUID().toString()详解 blog.csdn.net/qq_44942083…
MultipartFile实现文件的上传和下载blog.csdn.net/weixin_4605…
/**
* 通用接口
* 写法应该和员工管理接口一样
*/
@RestController
@RequestMapping("/common/upload")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {
@Autowired
private AliOssUtil aliOssUtil;
/**
* 文件上传
*
* @param file
* @return
*/
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file) {
log.info("文件上传,{}", file);
try {
//为了防止文件重名导致覆盖
String originalFilename = file.getOriginalFilename();//原始文件名
//获取原始文件名的后缀
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
//构造新文件名称 objectName
//UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法
String objectName = UUID.randomUUID().toString() + extension;
//文件的请求路径
String filePath = aliOssUtil.upload(file.getBytes(), objectName);
return Result.success(filePath);
} catch (IOException e) {
log.error("文件上传失败,{}", e);
}
return Result.error(MessageConstant.UPLOAD_FAILED);
}
}
over
一些注意事项
哥们儿这里更新密码后要记得保存啊不然登录不进去
还是细心点吧一点小细节真的会让我找问题找半天。
有配置对应的xml文件,mapper接口才会有小鸟。
实现类接口这里上面要有@Mapper注解,细心一点