从spring boot 2.2.9升级到2.6.2版本后,项目启动后访问报错
The dependencies of some of the beans in the application context form a cycle.
serviceCollectionIdCacheService
┌─────┐
| serviceProductInfoProviderImpl
↑ ↓
| serviceOfflineProviderImpl
↑ ↓
| serviceProductMappingProviderImpl
└─────┘
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
在2.6.0之前,spring会自动处理循环依赖的问题,2.6.0 以后的版本默认禁止 Bean 之间的循环引用,如果存在循环引用就会启动失败报错。
方案1:
清理循环引用的Bean
1、在字段上使用@Autowired注解,让Spring决定在合适的时机注入。
2、在@Autowired注解上方加上@Lazy注解(延迟加载)
(A—>B—>C—>D 一般在D引用A的@Autowired下加入@Lazy注解即可)
方案2:
it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
也可以暂时跳过,在yml配置中加入
spring:
main:
allow-circular-references: true
方案3:
在启动中加入也一样
public static void main(String[] args) {
SpringApplication sa = new SpringApplication(xx.class);
sa.setAllowCircularReferences(Boolean.TRUE);
sa.run(args);
使用构造函数注入时如何在Spring Boot中打破循环依赖循环
它很少发生,但是一旦发生,就很烦人。 您具有循环依赖关系,并且想要(或必须)坚持使用构造函数注入。
签出此仓库中的提交以查看如何完成:
第一个提交是具有循环依赖项的项目
三个提交尝试将@Lazy放入类/ bean定义(tl; dr:不起作用)
为了打破周期,您可以将@Lazy放在注射点之一,而spring将创建一个代理,从而打破了鸡肉和鸡蛋的情况
如果您使用的是Lombok,则必须自己编写构造函数(或使用IDE生成它)
您不再需要像其他教程所建议的那样将cglib添加为项目的依赖项
这基于Spring-boot 2.0.2
在Spring 5.1及更高版本中,还提供了一种新的循环依赖解决方案,即SmartInstantiationAwareBeanPostProcessor接口,它提供了更细粒度的控制和处理循环依赖的方式。这是因为Spring默认使用构造函数注入或者setter注入的方式创建Bean,如果两个Bean之间存在循环依赖,则无法满足其中一个Bean的创建要求。在Bean之间存在循环依赖时,Spring可以通过setter方法暂时设置null值或代理对象,等到Bean创建完毕后再将实际的依赖项注入到Bean中。
redis缓存穿透、缓存雪崩,有没有在实际的工作中遇到过,如果解决缓存雪崩问题;
redis的有几种集群方式;
redis的基本数据类型(String、List、Hash、Set、ZSet)的使用场景?
redis集群;
redis支持事务吗?如果不支持,如果保证事务一致性?
Java篇:
Java线程池初始化的几个核心参数及其作用
Java并发锁synchronized、reentractlock的用法
HashMap数据结构及原理
ConcurrentHashMap数据结构及原理,分段锁机制
NIO、BIO相关
Java多线程篇:
线程池的核心参数及用法说明?
多线程死锁如何排查(考察linux
在为任何项目设置连续的部署管道时,制定有针对性的测试计划至关重要。
有效的测试套件,反馈回路短
有效的测试套件包括多种测试策略,这些策略可导致较高的测试覆盖率,从而提高信心。 这些策略通常采用单元,组件,集成和验收测试的形式。 监控和警报。
测试套件需要快速运行,并且可靠。 这还不够强调。 如果测试是胡言乱语(即经常返回假阴性或阳性),则不能依靠它来给我们所需的期望信心。
测试还需要尽早在连续部署管道中运行,以缩短开发人员的反馈循环。 因此,理想情况下,大多数测试应设计为在构建拉取请求时运行(在从应用程序环境沙盒隔离的独立构建代理上)。 为了达到这一要求,测试必须没有关于它的任何外部依赖的可用性假设,并且被设计成单独运行。
被设计为快速,可靠和隔离故障的测试将具有一个短而有效的反馈循环,该反馈循环会通知开发人员该产品是否正常工作。
端到端集成测试的问题
单元测试是这样一种测试过程的一个很好的例子,它可以实现期望的有效性-它们快速,可靠并且可以隔离故障。 但是,仅凭单元测试是不够的,因为它们不能保证被测单元可以
SpringBoot启动时提示循环引用:it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.,即可以通过将spring.main.allow-circular-references设置为true来自动中断循环。
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-cir
earlySingletonExposure为false,那三级缓存中就没有TestA,在populateBean(TestB)中又会走getSingleton(),最终在beforeSingletonCreation抛出了循环依赖的异常。为true来解决循环依赖问题,这个配置在spring中不说默认为true吗,难道是springboot对这个配置进行了修改?那为啥还是出现了循环依赖问题呢?可是印象里,spring不是默认支持循环依赖的吗?在application.properties中,设置。
ApplicationContext context = new ClassPathXmlApplicationContext(...)其实很好理解,从名字上就可以猜出一二,就是在 ClassPath 中寻找 xml 配置文件,根...