Springboot 2.6.x以后循环依赖的问题的解决

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);

大功告成!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot 2.6.x中,可以使用Spring Data Elasticsearch来整合Elasticsearch。Spring Data Elasticsearch提供了一组用于构建Elasticsearch应用程序的API,并且可以轻松地与Spring Boot集成。下面是整合步骤: 1. 添加Spring Data Elasticsearch依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置Elasticsearch连接信息: 在application.properties中添加以下配置: ``` spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=localhost:9300 ``` 其中,cluster-name为Elasticsearch集群名称,cluster-nodes为Elasticsearch节点地址。 3. 创建Elasticsearch实体类: ``` @Document(indexName = "user", type = "_doc") public class User { @Id private String id; private String name; private int age; // getters and setters } ``` 其中,@Document注解用于指定索引名称和类型,@Id注解用于指定文档ID。 4. 创建Elasticsearch仓库类: ``` @Repository public interface UserRepository extends ElasticsearchRepository<User, String> { } ``` 其中,UserRepository继承自ElasticsearchRepository,可以直接使用Spring Data Elasticsearch提供的方法进行数据操作。 5. 在Service中使用Elasticsearch仓库类: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public void save(User user) { userRepository.save(user); } public User findById(String id) { return userRepository.findById(id).orElse(null); } public void deleteById(String id) { userRepository.deleteById(id); } public List<User> findAll() { return (List<User>) userRepository.findAll(); } } ``` 其中,save、findById、deleteById、findAll方法都是由ElasticsearchRepository提供的。 至此,Spring Boot 2.6.x整合Elasticsearch的步骤就完成了。通过使用Spring Data Elasticsearch,我们可以轻松地进行CRUD操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值