9.22几个问题

.

1.Vue常见的命令包括:

以上都是常见的以v-开头的vue命令,主要包括项目创建、开发、测试、构建等生命周期的命令。

  • 主要的vue常见命令以v-开头有:

  • vue create: 创建一个新项目

  • vue serve: 本地开发服务器,热重载功能

  • vue build: 生产环境构建,将会构建并优化项目

  • vue inspect: 检查项目的依赖关系

  • vue add: 添加功能,如添加vuex、路由等

  • vue router: 路由相关命令

  • vue test:unit: 单元测试

  • vue test:e2e: 端到端测试

  • vue ui: 图形化用户界面,用于管理创建和维护项目

  • vue devtools: vue开发者工具,用于调试vue组件

  • vue-cli-service: 辅助 vue-cli 的命令行接口

  • vue-cli-plugin: 创建 vue-cli 插件

  • vue-cli-plugin-xxx: 各种官方和第三方插件

2.session和cookie的区别

  1. 存储位置:
  • session存储在服务器端,cookie存储在客户端浏览器。
  1. 数据量:
  • session数据量较大,可以存储更多信息,cookie数据量较小,一般不超过4k。
  1. 有效期:
  • session依赖于浏览器或浏览器tab的打开,只要浏览器或tab不关闭,session就一直有效。

  • cookie有效期可以设置,一般默认关闭浏览器窗口后失效,也可以设置为定时失效。

  1. 安全性:
  • session存储在服务器端,相对更安全。cookie保存在客户端,数据在传输过程中可能被截取。
  1. 使用范围:
  • session只能在同一个服务器识别同一个用户。cookie可以被所有服务器读取。
  1. 实现机制:
  • session通过sessionID保存到服务器上,在请求时通过cookie或URL传递sessionID实现。

  • cookie直接保存到客户端浏览器上。

总之,session用于服务器端会话管理,cookie用于客户端信息存储。session数据量大,但依赖于浏览器;cookie数据量小,但可以跨请求使用。

3.什么是转发,什么是重定向,他们有什么区别。

所以总体来说,转发保留请求信息,重定向只能在URL中传参,转发在服务器内部进行,重定向需要两次请求。

  • 请求方式不同:
  • 转发是服务器内部的操作,客户端看不到转发,URL地址栏不变,还是原来的请求。

  • 重定向需要客户端重新发起请求,URL地址栏会发生变化,显示重定向后的地址。

  • 传参不同:
  • 转发可以保留请求中的所有信息,包括请求参数、Attribute等。

  • 重定向只能在URL地址中传递参数,请求域对象会丢失。

  • 响应不同:
  • 转发只产生一个响应,客户端看不出来有跳转发生。

  • 重定向会产生两次响应,一次返回重定向指令,一次返回新的页面。

  • 地址栏不同:
  • 转发地址栏URL不变

  • 性能不同:
  • 转发性能较好,只产生一次请求。

  • 重定向需要两次请求,性能略差。

  • 重定向地址栏URL会变成重定向后的地址

4.常见的响应码有哪些?提示404

  • 404 Not Found: 请求的资源不存在。

  • 200 OK: 请求成功。

  • 301 Moved Permanently: 请求的资源已永久移动到新位置。

  • 302 Found: 临时重定向。

  • 304 Not Modified: 请求的资源未修改,从缓存中返回资源。

  • 400 Bad Request: 请求语法错误,服务器无法理解。

  • 401 Unauthorized: 请求未经授权,需要用户登录。

  • 403 Forbidden: 服务器理解请求但拒绝响应。

  • 404 Not Found: 请求的资源不存在。

  • 500 Internal Server Error: 服务器内部错误,无法完成请求。

  • 502 Bad Gateway: 网关错误。

  • 503 Service Unavailable: 服务器暂时无法处理请求(可能过载或维护),一段时间后可重新尝试。

其中404表示请求的资源(页面、图片、文件等)在服务器上不存在,是最常见的错误码之一。其他如200、301、500也很常见。

5.你所知道的请求方式和响应方式有哪些?

请求方式:

  • GET: 获取资源。请求参数在URL中。

  • POST: 提交资源到服务器。请求参数在请求体中。

  • PUT: 更新资源。

  • DELETE: 删除资源。

  • HEAD: 获取资源报头。

  • OPTIONS: 获取支持的请求方法。

  • PATCH: 对资源进行部分更新。

响应方式:

  • HTML: 最常见的响应格式,用于渲染网页。

  • JSON: JavaScript对象表示法,用于API接口响应。

  • XML: 基于标签的响应格式。

  • Plain Text: 纯文本响应。

  • Image: 图片格式响应如JPG、PNG等。

  • Download: 用于文件下载的响应。

其他还有:

  • CONNECT: 用于建立隧道,通常用于SSL。

  • TRACE: 回显服务器收到的请求,用于测试或诊断。

  • LINK、UNLINK: 操作链接资源。

所以常见的请求方式有GET、POST等,响应方式主要有HTML、JSON、XML、Plain Text等格式。不同的请求方式和响应格式在不同场景下使用。

6.spring创建对象,注入,代替配置文件等常用注解有哪些(16个)

  • @Configuration:代替配置类

  • @ComponentScan:指定要扫描的包

  • @Import:导入其他配置类

  • @PropertySource:引入配置文件

  • @Component:将类标记为可自动扫描的组件

  • @Autowired:自动注入依赖

  • @Qualifier:指定特定的注入bean

  • @Resource:= @Autowired + @Qualifier  自动装配通过名称进行装配。

  • @Value:属性注入

  • @Controller:标识为控制器类

  • @Service:标识为服务类

  • @Repository:标识为数据访问类

  • @Component :标识为其他类

  • @Configuration:标识配置类

  • @Bean:定义bean

  • @Scope:定义bean的作用域

  • @Conditional:条件装配等。

7.springmvc常用请求和响应注解有哪些?

响应注解:

其他:

以上是Spring MVC常用的请求和响应注解,主要用于请求映射、参数绑定和响应处理等方面。

  • 请求注解:

  • @RequestMapping: 用来映射请求URL到处理方法。

  • @GetMapping: 专为HTTP GET请求映射。

  • @PostMapping: 专为HTTP POST请求映射。

  • @PutMapping: 专为HTTP PUT请求映射。

  • @DeleteMapping: 专为HTTP DELETE请求映射。

  • @PathVariable: 绑定URI模板变量到方法参数。

  • @ResponseBody: 将对象直接写入HTTP响应体中。

  • @RestController: 相当于@Controller和@ResponseBody的组合注解。

  • @ModelAttribute: 绑定请求参数或模型数据到方法参数。

  • @RequestHeader: 绑定请求头到方法参数。

  • @CookieValue: 绑定Cookie值到方法参数。

  • @ExceptionHandler: 处理控制器异常。

  • @InitBinder: 初始化数据绑定器。

  • @SessionAttributes: 绑定会话属性。

  • @RequestParam: 绑定请求参数到方法参数。

8.springmvc处理日期请求和响应的注解和怎么使用?

  • @DateTimeFormat:用于格式化日期/时间字符串,可以设置日期格式。

  • @JsonFormat:用于Jackson序列化/反序列化日期类型数据,也可以设置日期格式。

  • @RequestParam:可以直接将请求参数绑定到Date类型的参数上。
  • @InitBinder:数据绑定回调方法,用于处理请求参数和类型转换

  • @ResponseBody:可以直接将Date类型响应写出,会自动序列化为字符串。

  • @RequestBody:将请求体内容转为日期对象等。

9.springmvc执行流程

  • 1、DispatcherServlet接收请求。

  • 2、DispatcherServlet根据请求信息调用HandlerMapping,获得相应的Handler。

  • 3、HandlerMapping根据请求URL找到具体的Controller类和处理方法。

  • 4、DispatcherServlet调用HandlerAdapter,根据Handler获得适配器。

  • 5、HandlerAdapter调用具体的Controller处理方法。

  • 6、Controller处理后返回ModelAndView对象。

  • 7、HandlerAdapter将Controller处理结果封装为ModelAndView对象返回给DispatcherServlet。

  • 8、DispatcherServlet调用ViewResolver解析视图名称。

  • 9、ViewResolver根据视图名称获取具体View对象实例。

  • 10、DispatcherServlet调用View渲染视图,将模型数据填充到请求域中。

  • 11、View将页面展示到客户端。

  • 12、DispatcherServlet响应客户端,流程结束。

  • 总体来说,Spring MVC通过DispatcherServlet分发请求到对应的Controller,Controller处理后返回ModelAndView,ViewResolver解析视图并渲染页面输出响应结果。其中HandlerMapping和HandlerAdapter负责请求到处理器的映射与适配。

10.springmvc 拦截器

Spring MVC 拦截器是一个非常强大的功能,用于实现请求前后处理功能,比如登录检查、权限检查、数据校验等。

Spring MVC 拦截器的简述:

  • 拦截器实现HandlerInterceptor接口,重写其中的三个方法:preHandle、postHandle、afterCompletion。

  • preHandle方法在Controller处理之前执行,返回true则继续执行后续操作,返回false则中断后续操作。

  • postHandle方法在Controller处理之后执行,但在视图渲染之前执行。

  • afterCompletion方法在整个请求处理完成之后执行,如渲染视图等。

  • 在Spring MVC配置文件中配置拦截器,设置拦截规则,如拦截所有URL等。

  • 拦截器支持链式调用,每个拦截器的三个方法都会依次执行。

常见使用场景:

  • 登录检查:在preHandle中检查用户是否登录
  • 权限检查:检查用户权限
  • 数据校验:对表单数据进行校验
  • 日志记录:记录请求日志
  • 性能监控:记录请求时间
  • 防止重复提交:检查表单重复提交

等通过配置Spring MVC拦截器可以实现许多通用的前后处理功能,如安全控制、数据处理等。

  1. 注解配置:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  
  registry.addInterceptor(new LoginInterceptor());
  
  }

}
  1. JavaConfig方式:
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

  @Bean
  public HandlerInterceptor loginInterceptor() {
  return new LoginInterceptor();
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(loginInterceptor());
  }

}
  1. 直接new对象注册:
public class MvcConfig implements WebMvcConfigurer {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(new LoginInterceptor()); 
  }

}
  1. WebMvcConfigurer适配器:
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(new LoginInterceptor());
  }

}

所以总体来说,完全在Java代码中实现Spring MVC拦截器主要有注解配置、JavaConfig方式和实现WebMvcConfigurer接口三种方式,无需任何XML配置。

11.springAOP用到了什么设计模式,以及他的特点

所以总体来说,Spring AOP采用了代理模式、装饰器模式、观察者模式和模板方法模式,实现了无侵入式的面向切面编程功能。

  • 代理模式(Proxy Pattern)
  • Spring AOP就是通过为目标对象创建代理对象来实现切面功能的。它使用JDK动态代理或CGLIB代理来为目标对象创建代理。

  • 装饰器模式(Decorator Pattern)
  • Spring AOP的切面装饰目标对象,为其添加额外的功能,这也是装饰器模式的一种实现方式。

  • 观察者模式(Observer Pattern)
  • Spring AOP的切面类实现了Advice接口,可以看作是观察者,目标对象执行切入点时会通知观察者进行拦截。

  • 模板方法模式(Template Method Pattern)
  • Spring AOP通过Advice定义通知逻辑,目标方法通过调用流程模板执行通知逻辑,这也是模板方法模式。

    Spring AOP的主要特点:

  • 不修改源代码实现功能增强,通过代理和装饰器模式。

  • 面向切面编程,清晰划分关注点与功能模块。

  • 基于动态代理,运行期动态织入增强逻辑。

  • 采用基于接口的代理模式,不受限于类的继承关系。

  • 支持多种切面类型,如前置通知、后置通知等。

12.写一个springAOP程序有哪些步骤,增强的几个关键元素是什么?

  1. 定义一个接口或者抽象类,作为切入点签名。

  2. 定义一个实现类,实现接口或者继承抽象类,作为目标对象。

  3. 定义一个切面类,使用@Aspect注解。

  4. 在切面类中使用@Before、@AfterReturning等注解定义通知方法。

  5. 使用@Pointcut定义切入点表达式。

  6. 在Spring配置文件中开启注解驱动和组件扫描。

  7. 配置AOP代理,可以使用@EnableAspectJAutoProxy注解。

  8. 注入组件并测试功能增强是否生效。

Spring AOP的关键元素包括:

  • 切入点(Pointcut):需要增强的方法签名。

  • 通知(Advice):增强逻辑,如前置通知、后置返回通知等。

  • 切面(Aspect):切入点和通知的结合。

  • 目标对象(Target):被通知的对象。

  • AOP代理(Proxy):使用代理为目标对象创建代理对象。

所以通过定义切入点、通知和切面,注入到Spring容器,即可实现面向切面的功能增强。

13.mybatis中#和$区别是什么?

#:

  • 表示映射语句中的参数,如 #{id}。

  • MyBatis 会将 # 后面的内容解析为 OGNL 表达式进行动态设置。

  • #{id} 表示使用 id 参数进行设置。

$ :

  • 表示映射语句中的列名或表名等,如 select * from user where id = #{id}

  • MyBatis 不会对 $ 后面的内容进行解析,直接将其作为普通字符串使用。

  • ${tableName} 直接输出 tableName 字符串,不会解析为表达式。

区别:

  • 表示参数,MyBatis 会对其内容进行解析;

  • $ 表示普通字符串,MyBatis 不会对其内容进行解析。

使用场景:

  • 一般用于参数设置,如 #{id}、#{param.name}

  • 一般用于表名、字段名等需要输出字符串的场景,如一般用于表名、字段名等需要输出字符串的场景,如{tablePrefix}user

所以,#表示需要动态解析的表达式参数,#{xx}会被解析替换;表示普通字符串,表示普通字符串,{xx}输出字符串而不会被替换。这是 MyBatis 中 # 和 $ 符号的主要区别。

14.mybatis中常见的动态sql有哪些?批量操作是怎么做的

  1. if标签

根据条件包含where子句,实现条件查询。

  1. choose、when、otherwise标签

类似switch的多条件选择,选择性执行标签体内的SQL代码块。

  1. where标签

自动删掉多余的and字样。

  1. set标签

自动删掉多余的,号。

  1. foreach标签

迭代列表,构建IN条件或为每个对象执行更新/插入操作。

  1. trim标签

自定义删除额外的and/或字符。

  1. bind标签

从OGNL表达式中提取出值,并绑定到标签体内。

  1. sql标签

定义可重用的SQL代码块。

  1. include标签

插入外部sql文件内容。

foreach标签可以循环处理列表中的每个对象,为每个对象生成SQL语句。

15.短信登录流程是什么样的

  • 用户输入手机号,点击获取验证码按钮。

  • 服务端校验手机号格式是否正确,生成4-6位随机验证码。

  • 服务端调用短信接口,将验证码通过短信下发到用户手机。

  • 用户收到验证码后,在登录页面输入收到的验证码。

  • 客户端将手机号和验证码提交到服务端。

  • 服务端从数据库或Redis中查询该手机号对应的验证码是否正确:

  • 如果正确,生成登录token返回给客户端。

  • 如果错误,返回错误提示用户重新输入验证码。

  • 客户端收到token后,将token保存在本地存储如cookie中。

  • 后续请求都在请求头或参数中携带token。

  • 服务端从数据库或缓存中查询token是否有效:

  • 如果有效,代表用户已登录。

  • 如果无效,返回未登录状态。

  • 登录成功后,客户端可以访问需要登录的页面或接口功能。

16.统一异常处理怎么实现的

  1. 自定义异常类

定义通用的异常类如BusinessException,其他异常类继承该异常类。

  1. 全局异常处理类

实现HandlerExceptionResolver接口,重写resolveException方法,进行全局异常处理。

  1. AOP异常拦截

使用AOP定义异常切面,对指定包或类的异常进行拦截和处理。

  1. ControllerAdvice异常处理

使用@ControllerAdvice注解的类进行全局异常处理,类似HandlerExceptionResolver。

  1. 配置异常映射

在SpringMVC配置中配置异常映射,指定异常类和错误视图。

具体实现:

  1. 自定义异常类层次

  2. 定义ExceptionHandler类实现HandlerExceptionResolver

  3. 在类或方法上使用@ExceptionHandler注解处理异常

  4. 使用@ControllerAdvice和@ExceptionHandler注解处理全局异常

  5. SpringMVC配置异常映射关系

  6. AOP定义异常切面进行拦截处理

以上方式可以统一捕获异常,进行日志记录、错误码处理等操作,实现系统层面的异常统一处理机制。

17.如何创建一个springboot项目,有哪些步骤,用到哪些注解

  • 创建一个简单的Spring Boot项目主要步骤和使用到的关键注解如下:

  • 创建Maven项目,指定项目的打包方式为jar

  • 添加Spring Boot相关的starter依赖,如spring-boot-starter-web

  • 定义主程序入口类,添加@SpringBootApplication注解

  • 编写Controller类,添加@RestController注解

  • 定义接口方法,添加@RequestMapping注解

  • 编写业务逻辑代码

通过这些关键注解,可以快速创建一个基础的Spring Boot项目。主要步骤是创建Maven项目,添加依赖,定义主程序入口和Controller接口,编写业务代码并运行启动。

此外还可以使用:

@Autowired:自动注入Bean @Bean:注册Bean @Configuration:标注配置类

其中:

@SpringBootApplication:标注主程序类,启用自动配置和组件扫描

@RestController:标注Controller类,支持Restful风格接口

@RequestMapping:标注接口方法,定义请求URL映射规则

  • 运行主程序,启动项目

18.spring怎么解决数据库事务问题的,事务什么时候失效

Spring中解决数据库事务问题的主要方式有:

  1. 使用@Transactional注解标注事务方法。

  2. 配置TransactionManager事务管理器,使用TransactionTemplate或TransactionStatus直接管理事务。

事务的失效情况:

  • 方法执行异常导致事务回滚。如果方法内部抛出异常,事务将回滚。

  • 显式调用transactionManager.rollback()回滚事务。如果手动调用回滚,事务不会提交。

  • 事务超时未提交就会回滚。Spring默认如果事务在一定时间内未完成,会回滚事务。

  • 事务上下文发生错误也会回滚。如果事务管理发生错误,如无法获取连接,也会回滚。

  • 事务配置propagation级别不支持当前调用栈。不同的propagation类型决定事务如何在方法间传播。

所以总结来说,事务会在以下情况失效(回滚而不是提交成功):

  • 方法内部抛出异常
  • 手动调用回滚
  • 事务超时
  • 事务管理错误
  • propagation配置不匹配

只有方法正常返回且未手动回滚时,事务才会成功提交。其他情况都有可能导致事务回滚。

19.mybatis的一级缓存和二级缓存分别是什么样的,有什么区别,什么时候缓存失效

一级缓存(SqlSession级别):

  • 作用域:SqlSession。同一个SqlSession查询同一个sql,多次查询直接从缓存中读取。

  • 失效条件:SqlSession关闭或提交事务、手动清空缓存。

二级缓存(Mapper级别):

  • 作用域:同一个Mapper下的所有SqlSession。不同SqlSession可以共享查询结果。

  • 失效条件:

    • 缓存配置clearCache标签设置为true时,会清空缓存
    • 缓存配置flushInterval时间到时,会刷新缓存
    • 缓存配置size限制超出时,会刷新缓存
    • 缓存配置readWrite属性为true时,根据sql的写操作决定是否清空缓存
    • 映射文件配置statement标签的flushCache属性为true时,会清空缓存

区别:

  • 一级缓存作用在SqlSession,二级缓存作用在Mapper
  • 一级缓存自动工作,二级缓存需要手动配置开启
  • 一级缓存范围小,二级缓存范围大
  • 一级缓存默认存在,二级缓存需要满足一定条件才生效

所以一级缓存粒度小,但范围小;二级缓存粒度大,但需要额外配置。

20.系统登录权限怎么做的?短信登录怎么实现的

  1. 权限管理
  • 用户表存储用户信息和权限信息
  • 权限表存储权限点定义
  • 用户-权限关系表绑定用户和权限
  1. 登录认证
  • 用户名/手机号+密码登录
  • 短信验证码登录
    • 发送验证码到手机
    • 验证验证码
  1. 登录流程
  • 用户名/手机号+密码登录
    • 验证用户名/手机号和密码
    • 生成登录token返回
  • 短信验证码登录
    • 发送验证码到手机
    • 验证手机号和验证码
    • 生成登录token返回
  1. token验证
  • 登录后返回token
  • 后续请求携带token在header中
  • 服务端验证token有效性
  1. 权限验证
  • 获取用户权限信息
  • 权限点匹配请求URL权限检查
  • 权限不足返回无权限

短信登录实现:

  1. 发送短信验证码接口
  2. 验证短信验证码接口
  3. 登录生成token
  4. token验证后续请求

以上方式可以实现系统登录认证和权限控制,支持用户名密码登录和短信验证码登录两种模式。

21.系统的角色权限是怎么控制?

  1. 定义角色和权限表

角色表存储各个角色信息,权限表存储各个权限点信息。

  1. 角色-权限关系表

建立角色和权限的多对多关系表,记录每个角色拥有哪些权限。

  1. 用户-角色关系表

建立用户和角色的多对多关系表,记录每个用户拥有哪些角色。

  1. 权限点编码

为每个可以访问的页面、API等定义唯一的权限点编码。

  1. 权限校验
  • 获取当前用户的角色
  • 通过角色查询用户拥有的权限点
  • 对比请求需要的权限点是否被允许
  1. 动态菜单
  • 根据用户角色动态生成侧边菜单
  • 只展示用户拥有权限的菜单项
  1. 细粒度控制

可以为每个权限点细分更多子权限点,实现更细粒度的控制。

通过上述方式,可以实现基于角色的访问控制,动态生成不同角色的界面菜单,达到细粒度的权限管理目标。

22.为什么使用redis

  • 速度快
  • Redis是内存存储,读写速度远远超过磁盘存储,很适合需要高性能的场景。

  • 支持不同的数据类型
  • Redis不仅仅支持简单的key-value类型,还提供list,set,zset,hash等数据类型,更丰富的数据结构。

  • 可靠性好
  • Redis支持持久化,可以将数据保存到磁盘或者复制到其他Redis服务器,在一定程度上保证了数据的安全性。

  • 适合缓存
  • Redis作为缓存架构非常合适,可以有效缓解数据库的压力,提高网站/APP的性能和响应速度。

  • 发布订阅功能
  • Redis的发布订阅功能可以实现不同系统或组件之间的无缝通信,用于构建实时应用。

  • 集群支持
  • Redis支持主从复制和哨兵机制,可以横向扩展实现集群,提高可用性。

  • 社区活跃
  • Redis社区活跃,开源版本更新频繁,生态圈成熟,使用和扩展都很容易。

  • 多种语言客户端
  • Redis支持多种语言的客户端库,与主流语言无缝集成。

所以总体来说,Redis因其高性能、数据类型丰富、可靠性好等优点,广泛应用于缓存、消息队列、实时应用等场景。

23.自定义注解怎么写,用在什么场景下

  1. 定义注解 使用@Retention和@Target注解定义注解的目标和生命周期。

  2. 使用注解 在需要使用的位置添加自定义注解。

  3. 处理注解 通过反射获取注解信息,并进行相应处理。

常见使用场景:

  • 参数校验:添加参数校验注解,实现参数校验功能。

  • 日志记录:标注需要记录日志的方法。

  • 事务管理:标注事务方法,实现事务控制。

  • 缓存:标注需要缓存结果的方法,实现方法结果缓存。

  • 权限控制:标注需要权限校验的方法。

  • 序列化:标注需要序列化的类。

  • 版本控制:标注API版本号。

  • 多环境配置:标注需要读取不同环境配置文件的类或方法。

通过自定义注解可以给代码添加元数据,方便后续处理通用功能,如校验、事务控制、缓存等。一般用于给类、方法、属性添加标识或配置信息。使用注解可以实现跨切面功能而无需修改原代码。这就是自定义注解常见的定义、使用和应用场景。

24.动态代理

动态代理是一种在运行时根据已经存在的类来扩展其功能的技术。

动态代理的主要实现方式有以下两种:

  1. JDK动态代理

JDK动态代理需要接口,它会在运行时动态生成一个实现了指定接口的子类,并覆盖其中的所有方法。

实现步骤:

  • 定义接口
  • 实现InvocationHandler接口
  • 使用Proxy.newProxyInstance()方法创建代理对象
  1. CGLIB动态代理

CGLIB动态代理不需要接口,它通过在运行时对目标类进行子类化来生成代理类,覆盖其中的方法。

实现步骤:

  • 引入CGLIB依赖
  • 实现MethodInterceptor接口
  • 使用Enhancer.create()方法创建代理对象

动态代理的主要应用场景包括:

  • 事务处理:为方法添加事务管理功能
  • 日志记录:为方法添加日志记录功能
  • 权限检查:为方法添加权限检查功能
  • 声明式事务:使用Spring AOP实现声明式事务
  • 缓存处理:为方法结果添加缓存功能

等通过动态代理可以在不修改目标类代码的情况下,给方法添加共性功能的场景。它通过代理模式提高了代码的可扩展性和复用性。

你可能感兴趣的:(java,spring,boot)