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.异常被捕获
-
方法不是public
-
没有被Spring管理
-
异常类型错误
-
自身调用问题
-
传播类型不支持事务,导致事务失效
-
多线程调用,导致事务失效
详细内容: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文件以及条件注解**。具体如下:
- 启动类注解:Spring Boot的自动配置开始于它的启动类,该类上有一个@SpringBootApplication注解。这个注解是一个便利的注解,它包含了@EnableAutoConfiguration注解。
- 启用自动配置:@EnableAutoConfiguration是实现自动配置的关键,它会告诉Spring Boot根据添加的依赖来自动配置项目。
- 依赖条件注解:在自动配置类中,会使用如@ConditionalOnClass、@ConditionalOnMissingBean等条件注解,这些注解可以保证只有在满足特定条件时才会进行自动配置。
- 属性配置:外部属性配置(如application.properties或application.yml)也会影响自动配置的过程。Spring Boot会根据这些文件中的配置来决定某些自动配置是否生效。
- 自动配置报告:Spring Boot提供了一个自动配置报告,通过运行应用程序并访问一个特定的端点,可以查看哪些自动配置被应用了,哪些没有被应用,以及不应用的原因。
- spring.factories文件:这是自动配置类的索引,Spring Boot在启动时会扫描这个文件,找到并加载所有符合当前应用环境的自动配置类。
- 排除自动配置:如果需要排除某个自动配置,可以在@EnableAutoConfiguration注解中使用exclude属性或者在其他配置类中使用@EnableAutoConfiguration(exclude = {...})来排除不需要的自动配置类。
- 自定义自动配置:Spring Boot允许开发者创建自己的自动配置类,只需遵循一定的命名约定和结构,就可以让自定义的配置生效。
- 优先级:当有多个配置候选者时,Spring Boot会根据它们在classpath中的顺序以及定义的优先级来确定最终的配置。
- 外部化配置:Spring Boot鼓励外部化配置,这意味着除了代码内部定义的配置之外,还可以通过配置文件、环境变量或命令行参数来提供配置信息。
综上所述,Spring Boot的自动配置原理是通过一系列的机制来减少项目配置的工作量,使得开发者能够更快地启动和部署应用。
SpringMVC
Spring MVC的请求流程涉及一系列组件和步骤,具体如下:
- 用户发送请求:用户的请求首先到达前端控制器DispatcherServlet。
- 前端控制器处理:DispatcherServlet接收到请求后,将请求信息交给处理器映射器(HandlerMapping)。
- 处理器映射:HandlerMapping根据请求的URL找到对应的处理器(Controller),并返回一个执行链,如果配置了拦截器,则还会包括拦截器。
- 调用处理器:DispatcherServlet通过HandlerAdapter(处理器适配器)调用对应的处理器(Controller)的方法。
- 方法处理:在Controller中,使用@RequestMapping等注解定义请求规则,指定哪个方法处理哪种类型的请求。
- 渲染视图:处理器方法处理完请求后,通常会返回一个模型和视图名称,DispatcherServlet再根据视图解析器配置来渲染最终的视图。
- 返回响应:最后,将渲染好的视图返回给客户端作为响应。
总的来说,这个流程体现了典型的MVC(Model-View-Controller)模式,其中DispatcherServlet作为中心调度者,负责协调各个组件完成请求的处理工作。了解这一流程有助于开发者在遇到问题时快速定位问题所在,从而提高开发效率。
过滤器/拦截器/AOP
请求的执行顺序是:请求进入容器 -> 进入过滤器 -> 进入 Servlet -> 进入拦截器 -> 执行控制器。
-
过滤器的应用
过滤器用来拦截请求,过滤request请求,防止xss脚本攻击,防止sql注入,或者敏感词过滤等等
-
拦截器应用
拦截器的应用,就是我们的AOP,通过自定义拦截器,然后在WebMvcConfig中添加自定义的拦截器,可以实现登录验证、权限验证、操作日志等等
Mybatis
#与$
-
是预编译(预处理)的方式,它可以防止SQL注入攻击,因为MyBatis会对它进行转义处理,确保数据的安全性。
- $ 是直接字符串替换的方式,MyBatis不会对它进行任何处理,所以使用它可能会导致SQL注入攻击。