1.问题描述
SpringBoot 2.6.x以前是允许循环依赖的,但2.6.x之后就被禁止了,所以大家在阅读以前的代码的时候或许发现项目出现了这样的错误:
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| securityConfig (field private com.sammy.server.service.ISysUserService com.sammy.server.config.security.SecurityConfig.userService)
↑ ↓
| sysUserServiceImpl (field private org.springframework.security.crypto.password.PasswordEncoder com.sammy.server.service.impl.SysUserServiceImpl.passwordEncoder)
└─────┘
Action:
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.
这是因为我在SecurityConfig这个类中注入了:
@Autowired
private ISysUserService userService;
SysUser user = userService.getUserByUsername(username);
然后在sysUserServiceImpl这个类中注入了:
@Autowired
private UserDetailsService userDetailsService;
UserDetails userDetails = userDetailsService.loadUserByUsername(userName);
导致了循环依赖
2.解决方案
(1)方法一:(不推荐)
在yml文件中写入
spring:
main:
allow-circular-references: true
(2)方法二:(推荐)
引入依赖:
<dependency>
<groupId>xin.altitude.cms.common</groupId>
<artifactId>ucode-cms-common</artifactId>
<version>1.3.4</version>
</dependency>
把SecurityConfig中上面提到的部分替换为
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
ISysUserService userService = getUserService();
SysUser user = userService.getUserByUsername(username);
把sysUserServiceImpl中上面提到的部分替换为
private UserDetailsService getUserDetailsService(){
return SpringUtils.getBean(UserDetailsService.class);
}
//.....略
UserDetailsService userDetailsService = getUserDetailsService();
UserDetails userDetails = userDetailsService.loadUserByUsername(userName);
大功告成!