首页后端开发其他后端知识Spring循环依赖的解决有多少办法,怎样做?

Spring循环依赖的解决有多少办法,怎样做?

时间2024-03-24 19:06:03发布访客分类其他后端知识浏览973
导读:今天这篇给大家分享的知识是“Spring循环依赖的解决有多少办法,怎样做?”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,因此分享发大家做个参考,下文的讲解详细,步骤过程清晰,希望这篇“Spring循环依赖的解决有多少办法,怎样做?...
今天这篇给大家分享的知识是“Spring循环依赖的解决有多少办法,怎样做?”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,因此分享发大家做个参考,下文的讲解详细,步骤过程清晰,希望这篇“Spring循环依赖的解决有多少办法,怎样做?”文章能帮助大家解决问题。

  

  

简介

说明

本文用实例介绍如何解决Spring的循环依赖问题。

相关网址

Spring循环依赖之问题复现详解

公共代码

package com.example.controller;
    
 
import com.example.tmp.A;
    
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.web.bind.annotation.GetMapping;
    
import org.springframework.web.bind.annotation.RestController;

 
@RestController
public class HelloController {
    
    @Autowired
    private A a;

 
    @GetMapping("/test1")
    public String test1() {
    
        return a.getTest();

    }

}
    

方案1. Feild注入单例(@AutoWired)

代码

package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class A {
    
    @Autowired
    private B b;
    
 
    private String name = "Tony";

 
    public String getName() {
    
        return name;

    }

 
    public void setName(String name) {
    
        this.name = name;

    }

 
    public String getTest() {
    
        return b.getAge().toString() + name;

    }

}
    
package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class B {
    
    @Autowired
    private A a;
    
 
    private Integer age = 20;

 
    public Integer getAge() {
    
        return age;

    }

 
    public void setAge(Integer age) {
    
        this.age = age;

    }

 
}
    

测试

启动不报错。

postman访问:http://localhost:8080/test1

后端结果:不报错

postman结果: 20Tony

方案2. 构造器注入+@Lazy

延迟加载:在注入依赖时,先注入代理对象,当首次使用时再创建对象完成注入。

代码

package com.example.tmp;
    
 
import org.springframework.context.annotation.Lazy;
    
import org.springframework.stereotype.Component;

 
@Component
public class A {
    
    private B b;

 
    public A(@Lazy B b) {
    
        this.b = b;

    }
    
 
    private String name = "Tony";

 
    public String getName() {
    
        return name;

    }

 
    public void setName(String name) {
    
        this.name = name;

    }

 
    public String getTest() {
    
        return b.getAge().toString() + name;

    }

}
    
package com.example.tmp;
    
 
import org.springframework.context.annotation.Lazy;
    
import org.springframework.stereotype.Component;

 
@Component
public class B {
    
    private A a;

 
    public B(@Lazy A a) {
    
        this.a = a;

    }
    
 
    private Integer age = 20;

 
    public Integer getAge() {
    
        return age;

    }

 
    public void setAge(Integer age) {
    
        this.age = age;

    }

 
}
    

测试

启动不报错。

postman访问:http://localhost:8080/test1

后端结果:不报错

postman结果: 20Tony

方案3. Setter/Field注入单例

代码

package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class A {
    
    private B b;
    
 
    private String name = "Tony";

 
    public String getName() {
    
        return name;

    }

 
    public void setName(String name) {
    
        this.name = name;

    }

 
    public String getTest() {
    
        return b.getAge().toString() + name;

    }

 
    public B getB() {
    
        return b;

    }

 
    @Autowired
    public void setB(B b) {
    
        this.b = b;

    }

}
    
package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class B {
    
    private A a;
    
 
    private Integer age = 20;

 
    public Integer getAge() {
    
        return age;

    }

 
    public void setAge(Integer age) {
    
        this.age = age;

    }

 
    public A getA() {
    
        return a;

    }

 
    @Autowired
    public void setA(A a) {
    
        this.a = a;

    }

}
    

测试

启动不报错。

postman访问:http://localhost:8080/test1

后端结果:不报错

postman结果: 20Tony

方案4. @PostConstruct

代码

package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;
    
 
import javax.annotation.PostConstruct;

 
@Component
public class A {
    
    @Autowired
    private B b;

 
    @PostConstruct
    public void init() {
    
        b.setA(this);

    }
    
 
    private String name = "Tony";

 
    public String getName() {
    
        return name;

    }

 
    public void setName(String name) {
    
        this.name = name;

    }

 
    public String getTest() {
    
        return b.getAge().toString() + name;

    }

}
    
package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class B {
    
    @Autowired
    private A a;
    
 
    private Integer age = 20;

 
    public Integer getAge() {
    
        return age;

    }

 
    public void setAge(Integer age) {
    
        this.age = age;

    }

 
    public A getA() {
    
        return a;

    }

 
    public void setA(A a) {
    
        this.a = a;

    }

}
    

测试

启动不报错。

postman访问:http://localhost:8080/test1

后端结果:不报错

postman结果: 20Tony

方案5. 实现ApplicationContextAware与InitializingBean

代码

package com.example.tmp;
    
 
import org.springframework.beans.BeansException;
    
import org.springframework.beans.factory.InitializingBean;
    
import org.springframework.context.ApplicationContext;
    
import org.springframework.context.ApplicationContextAware;
    
import org.springframework.stereotype.Component;

 
@Component
public class A implements ApplicationContextAware, InitializingBean {
    
    private B b;
    
 
    private ApplicationContext context;
    
 
    private String name = "Tony";

 
    public String getName() {
    
        return name;

    }

 
    public void setName(String name) {
    
        this.name = name;

    }

 
    public String getTest() {
    
        return b.getAge().toString() + name;

    }

 
    @Override
    public void afterPropertiesSet() throws Exception {
    
        this.b = context.getBean(B.class);

    }

 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
        this.context = applicationContext;

    }

}
    
package com.example.tmp;
    
 
import org.springframework.beans.factory.annotation.Autowired;
    
import org.springframework.stereotype.Component;

 
@Component
public class B {
    
    @Autowired
    private A a;
    
 
    private Integer age = 20;

 
    public Integer getAge() {
    
        return age;

    }

 
    public void setAge(Integer age) {
    
        this.age = age;

    }

}
    

测试

启动不报错。

postman访问:http://localhost:8080/test1

后端结果:不报错

postman结果: 20Tony



感谢各位的阅读,以上就是“Spring循环依赖的解决有多少办法,怎样做?”的内容了,通过以上内容的阐述,相信大家对Spring循环依赖的解决有多少办法,怎样做?已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注网络,网络将为大家推送更多相关知识点的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Spring循环依赖的解决有多少办法,怎样做?
本文地址: https://pptw.com/jishu/652258.html
oracle中删除用户的操作是什么? Spring的循环依赖的原理是什么,怎样理解?

游客 回复需填写必要信息