Spring循环依赖的解决有多少办法,怎样做?
导读:今天这篇给大家分享的知识是“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