Spring相关

Spring

循环依赖

循环依赖是指两个或多个Bean之间相互依赖的情况,默认情况下,Spring框架不允许这种循环依赖,可能导致应用程序启动时出现问题或者运行时的不确定性行为。当检测到循环依赖时,Spring会启动失败

在某些情况下,开发者可能需要允许循环依赖的存在,配置文件中设置spring.main.allow-circular-references参数为true,默认是false

  • 解决
    • 使用@Lazy注解:在需要延迟加载的Bean上添加@Lazy注解,这样Spring容器会在第一次使用时才创建该Bean,从而避免了循环依赖的问题。
    • 使用setter方法注入:将依赖注入从构造函数改为setter方法,这样可以延迟Bean的创建和初始化,从而避免循环依赖的问题。
    • 使用@PostConstruct注解:在需要延迟初始化的Bean上添加@PostConstruct注解,这样Spring容器会在Bean创建后立即调用该方法,从而解决了循环依赖的问题。

AOP

aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

前置,后置,环绕

  • 使用场景
    权限管理、异常处理、操作日志、事务控制。
  • AOP原理(实现方式)
    Spring AOP的动态代理主要有两种方式实现,JDK动态代理和cglib动态代理。

事务

未提交读,提交读,可重复读(默认),序列化,

详细内容:https://blog.csdn.net/a3562323/article/details/136682864

事务失效的场景

1.异常被捕获

  1. 方法不是public

  2. 没有被Spring管理

  3. 异常类型错误

  4. 自身调用问题

  5. 传播类型不支持事务,导致事务失效

  6. 多线程调用,导致事务失效

详细内容:https://blog.csdn.net/a3562323/article/details/130381053

事务传播行为类型

在表格中展示Spring框架的事务传播行为类型及其说明,请参考以下内容:

事务传播行为类型 说明
PROPAGATION_REQUIRED(默认) 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行。
PROPAGATION_MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
PROPAGATION_REQUIRES_NEW 如果当前存在事务,则挂起当前事务并创建一个新的事务;如果当前没有事务,则创建一个新的事务。
PROPAGATION_NOT_SUPPORTED 如果当前存在事务,则以非事务的方式执行;如果当前没有事务,则创建一个新的事务。
PROPAGATION_NEVER 如果当前存在事务,则抛出异常;如果当前没有事务,则以非事务的方式执行。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套的事务内执行;如果当前没有事务,则创建一个新的事务。

这些传播行为类型是Spring框架中的一部分,用于声明式事务管理。它们定义了方法调用的事务边界如何被处理。例如,PROPAGATION_REQUIRED是最常用的传播行为,它确保了方法总是在事务中执行,无论调用它的外部代码是否已经运行在一个事务中。

在使用Spring的@Transactional注解时,可以通过设置其propagation属性来指定所需的事务传播行为。这有助于开发者控制事务的边界和行为,避免数据不一致和其他潜在的事务问题。

如何热更新配置

更新配置后无需重启服务,使用@RefreshScope+SpringCloud的配置中心

自动配置原理

Spring Boot的自动配置原理主要基于**@EnableAutoConfiguration注解和spring.factories文件以及条件注解**。具体如下:

  1. 启动类注解:Spring Boot的自动配置开始于它的启动类,该类上有一个@SpringBootApplication注解。这个注解是一个便利的注解,它包含了@EnableAutoConfiguration注解。
  2. 启用自动配置:@EnableAutoConfiguration是实现自动配置的关键,它会告诉Spring Boot根据添加的依赖来自动配置项目。
  3. 依赖条件注解:在自动配置类中,会使用如@ConditionalOnClass、@ConditionalOnMissingBean等条件注解,这些注解可以保证只有在满足特定条件时才会进行自动配置。
  4. 属性配置:外部属性配置(如application.properties或application.yml)也会影响自动配置的过程。Spring Boot会根据这些文件中的配置来决定某些自动配置是否生效。
  5. 自动配置报告:Spring Boot提供了一个自动配置报告,通过运行应用程序并访问一个特定的端点,可以查看哪些自动配置被应用了,哪些没有被应用,以及不应用的原因。
  6. spring.factories文件:这是自动配置类的索引,Spring Boot在启动时会扫描这个文件,找到并加载所有符合当前应用环境的自动配置类。
  7. 排除自动配置:如果需要排除某个自动配置,可以在@EnableAutoConfiguration注解中使用exclude属性或者在其他配置类中使用@EnableAutoConfiguration(exclude = {...})来排除不需要的自动配置类。
  8. 自定义自动配置:Spring Boot允许开发者创建自己的自动配置类,只需遵循一定的命名约定和结构,就可以让自定义的配置生效。
  9. 优先级:当有多个配置候选者时,Spring Boot会根据它们在classpath中的顺序以及定义的优先级来确定最终的配置。
  10. 外部化配置:Spring Boot鼓励外部化配置,这意味着除了代码内部定义的配置之外,还可以通过配置文件、环境变量或命令行参数来提供配置信息。

综上所述,Spring Boot的自动配置原理是通过一系列的机制来减少项目配置的工作量,使得开发者能够更快地启动和部署应用。

SpringMVC

Spring MVC的请求流程涉及一系列组件和步骤,具体如下:

  1. 用户发送请求:用户的请求首先到达前端控制器DispatcherServlet。
  2. 前端控制器处理:DispatcherServlet接收到请求后,将请求信息交给处理器映射器(HandlerMapping)。
  3. 处理器映射:HandlerMapping根据请求的URL找到对应的处理器(Controller),并返回一个执行链,如果配置了拦截器,则还会包括拦截器。
  4. 调用处理器:DispatcherServlet通过HandlerAdapter(处理器适配器)调用对应的处理器(Controller)的方法。
  5. 方法处理:在Controller中,使用@RequestMapping等注解定义请求规则,指定哪个方法处理哪种类型的请求。
  6. 渲染视图:处理器方法处理完请求后,通常会返回一个模型和视图名称,DispatcherServlet再根据视图解析器配置来渲染最终的视图。
  7. 返回响应:最后,将渲染好的视图返回给客户端作为响应。

总的来说,这个流程体现了典型的MVC(Model-View-Controller)模式,其中DispatcherServlet作为中心调度者,负责协调各个组件完成请求的处理工作。了解这一流程有助于开发者在遇到问题时快速定位问题所在,从而提高开发效率。

过滤器/拦截器/AOP

请求的执行顺序是:请求进入容器 -> 进入过滤器 -> 进入 Servlet -> 进入拦截器 -> 执行控制器。

  • 过滤器的应用

    过滤器用来拦截请求,过滤request请求,防止xss脚本攻击,防止sql注入,或者敏感词过滤等等

  • 拦截器应用

    拦截器的应用,就是我们的AOP,通过自定义拦截器,然后在WebMvcConfig中添加自定义的拦截器,可以实现登录验证、权限验证、操作日志等等

Mybatis

#与$

  • 是预编译(预处理)的方式,它可以防止SQL注入攻击,因为MyBatis会对它进行转义处理,确保数据的安全性。

  • $ 是直接字符串替换的方式,MyBatis不会对它进行任何处理,所以使用它可能会导致SQL注入攻击。
相关推荐
小发明家啦啦啦啦啦2 分钟前
If you already have a 64-bit JDK installed ,defined a JAVA_HOME...的错误
java·ide·intellij-idea
拾光师13 分钟前
玩转springboot之springboot异步执行
java
坐忘3GQ23 分钟前
65.Python-web框架-Django-免费模板django-datta-able的admin_datta
后端·python·django·templates·datta able·admin_datta
一大颗萝卜25 分钟前
【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展
java·spring·设计模式·简单工厂模式·策略模式·模板方法模式·开闭原则
IT界的奇葩33 分钟前
关于Disruptor监听策略
java·高并发·多线程·disruptor
LightOfNight41 分钟前
【后端面试题】【中间件】【NoSQL】ElasticSearch的优化方案1(分页查询、刷新间隔、批量提交)
数据库·redis·后端·elasticsearch·缓存·中间件·nosql
eclipsercp1 小时前
《每天5分钟用Flask搭建一个管理系统》 第7章:用户认证
后端·python·flask
爱我所爱flash1 小时前
难道 Java 已经过时了?
java·开发语言·学习
Karen1981 小时前
基于weixin小程序农场驿站系统的设计
java·spring boot·mysql·毕业设计·课程设计
经海路大白狗1 小时前
开启IT世界的第一步:高考新生的暑期学习指南
前端·后端·python·学习·高考