作者是根据黑马课程来学习的
1.完成了菜品的对应接口功能实现(并对其上传到Github)
2.完成了公共字段填充功能实现(使用了Aop面向切面的思想 =》重要思想)
3.完成了实现文件上传的功能实现(使用的是阿里云OSS)
1.为什么要实现这个功能?
一个问题:当你每次实现添加功能的时候至少有(创建时间与更新时间)这两个属性每次都要赋值,且每次操作的代码是不是相同的,实现修改功能时至少有(更新时间)这个属性要修改吧,每次都要写不麻烦吗?那么为了避免代码冗余,我们应该来实现这个公共字段填充功能(了解一下Aop思想)
2.Aop(面向切面的思想 ):我就用自己的理解来解释一下,Oop(面对对象)是不是通过封装对象来实现相应功能,而不是用单一属性,而Aop思想就是把冗余的代码抽离出来(假如有部分方法里都要实现这段代码,我们就可以抽离出来,进行封装)(动态代理)
3.怎么实现的:
1.自定义注解@AutoFill 2.自定义切面类AutoFilAspect 3.Mapper对应方法上加入注解@AutoFill(update,insert方法)
4.具体实现:
1.自定义注解:
要求:自定义注解一定要加上@Target(确定注解可以用在哪里(比如方法,类,接口))与@Retention注解(确定注解在什么地方有效),并且要在类中定义给值类型(必须要有值)
OpertionType是一个枚举类(定义了要抽取代码的Mapper方法功能名),而注解AutoFill里面要求我们用注解时必须给它一个Opertion的值 (具体知识点在下面扩展处)
2.自定义切面类:
要求:加入@Aspect(切面类必须的注解) 与@Component(将该Bean交给IOC容器管理)
1.第一步:定义切入点(前面是定义扫描范围,后面是对应只扫描加入@AutoFill注解的方法)
有个疑问:我只写@annotation这段代码不就行了,只要扫到加了这个注解的方法就执行切面的通知不就行了,为什么前面还定义一个扫描范围呢? =》(这样是不是效率高了,本来是每个包都要扫描的,现在只有扫描我定义的这个包就行了)
2.第二步:定义通知(类型为@Before,为什么? =》我的本意是不是就赋值,是不是只要在方法执行之前赋值完就行了)
思考:这里老师使用的是:签名向下转型 --> 获取注解 --> 获取注解中的值 --> 判断方法类型(update,insert)--> 反射得到set方法(反射知识在下面) --> 获取执行方法的形参(一个准则:实体类放形参第一位,方便取出)-->取出要赋值的实体类 -->赋值(充分利用了注解)
那么我们是不是可以这样写:直接获取执行方法的方法名(缺陷是要Mapper接口中定义方法名时是标准命名) --> 判断方法类型(是否包含这个字段)(update,insert)--> 反射得到set方法 --> 获取执行方法的形参(一个准则:实体类放形参第一位,方便取出)-->取出要赋值的实体类 --> 赋值(充分利用了注解)
3.Mapper上加入自定义注解:(注意这里自定义注解必须给值,不然会报错)
1.为什么要实现这个功能:你前端页面是不是要展示你的文件数据(图片),怎么展示呢?
2.具体实现:通过用户上传文件 --> 前端将文件传到服务端 --> 服务端接收到文件 --> 调用阿里云OSS将文件存入OSS --> OSS再返回这个存入文件的访问路径(访问这个路径可以直接下载该文件)--> 服务端接收路径存入数据库 --> 再返回这个路径给前端 --> 前端访问这个路径直接下载这个文件将其展示在页面上
3.建议自己会去定义关于操作阿里云OSS的工具类
4.注意:接收前端传过来的文件参数时,接收参数(类型:MultipartFile)要保持与文件参数名一致
1.@Target(指定注解可用位置,有很多类型可以选,具体代表功能网上搜,教你怎么看),你直接Ctrl+左键就可以进入相应源码中,选中这个ElementType(就可以看到有什么类型了)
2.@Retention(指定注解在什么地方有效,配合反射使用),同理Ctrl+左键进入RetentionPolicy
3.注解类中必须要定义一个参数成员 ,怎么定义?
一般定义:参数类型 自定义名称(一般取名value)+();
定义默认值:参数类型 自定义名称() default +默认值;(当然value可以定义别的名字)
1.就说点我觉得重要的(多使用这个思想)
2.环绕通知是最重要的(拦截器///过滤器是不是要先拦截校验(之前说过,是不是可以进行ThreadLocal存值),通过则放行(执行方法会取出值),执行完返回(移除TreadLocal))
3.利用Aop可以解决代码冗余,提高代码复用性(抽离处重复代码),那么是不是也增强了代码的可维护性和扩展性(只需要该这一处就行)
问题1:
老师说为了保证阿里云OSS这个工具类的Bean对象是唯一的,因为它是工具类嘛,有一个就行了,然后老师就加上了@ConditionalOnMissingBean,但是这个注解并不能实现这个功能
证明1:
1.Spring的@Bean,你加上了这个注解,默认就是单例的,只会创建一个Bean,无论这个配置类被加载了多少次,或者是有多少个配置类,就是只能存在一个相同类型的对象(多个通类型会报错,使用@Primary(优先注入),或者@Qualifier(指定名称)) 2.@ConditionalOnMissingBean的功能是不存在这个指定类型的Bean时才会创建这个被标记的Bean(避免重复覆盖),并不能保证唯一
问题2:
老师在创建AliOssutil对象时使用的是new对象,一个个set赋值,但是老师之前说过的简便方法都没有使用 1.老师的new --> se一个个t赋值 2.利用注解@Builder,链式赋值 3.利用工具BeanUtils.copyProperties(对象1,对象2) ,将对象1里面的属性值赋值给对象2里面的属性(属性名要一一对应,没有要求属性数量一样,只是能对应上的它就赋值)