springbean初始化流程图 Spring如何解决循环依赖的问题?
Spring如何解决循环依赖的问题?
(一)SpringIOC容器---对象停止循环依赖
1.什么是循环依赖?what?
(1)循环依赖--dstrok循环摘录。---a8即2个或以上bean一起所属对方,最终形成闭环。
eg:A依恋B,B依恋C,C又依赖性太强A。【尽量:这里又不是函数的循环动态创建【是个死循环,如果有画上句号条件】,是对象相互依赖关系】
2.Spring中重复运行依恋的场景?where?
①:构造器的循环依赖。【这个Spring能解决不了】
StudentA有参构造是StudentB。StudentB的有参构造是StudentC,StudentC的有参构造是StudentA,这样的话就有一种了一个循环依赖的情况,
我们都把这三个Bean丢给Spring管理,用长有参构造构造函数
stateclassStudentA{
privateStudentBstudentB
statevoidsetStudentB(StudentBstudentB){
studentB
}
publicStudentA(){
}
welfareStudentA(StudentBstudentB){
studentB
}
}
[java]viewplain剪切粘贴
employeeclassStudentB{
privateStudentCstudentC
statevoidsetStudentC(StudentCstudentC){
studentC
}
stateStudentB(){
}
employeeStudentB(StudentCstudentC){
studentC
}
}
[java]viewplain全部复制
publicclassStudentC{
privateStudentAstudentA
statevoidsetStudentA(StudentAstudentA){
studentA
}
employeeStudentC(){
}
welfareStudentC(StudentAstudentA){
studentA
}
}
[html]viewplain剪切粘贴
ltbeanida
ltconstructor-argindex0refbgtlt/constructor-arggt
lt/beangt
ltbeanidb
ltconstructor-argindex0refcgtlt/constructor-arggt
lt/beangt
ltbeanidc
ltconstructor-argindex0refagtlt/constructor-arggt
lt/beangt
下面是测试类:
[java]viewplain全部复制
welfareclassTest{
welfarestaticvoidmain(String[]args){
ApplicationContextcontextnewClassPathXmlApplicationContext(com/zfx/student/applicationContext.xml)
((a
spring bean class作用?
1.作用
Bean标签是作用于配置对象,让spring来创建战队的。
默认情况下它调用的是类中的无参构造函数。假如没有无参构造函数则又不能创建成功。
2.属性
id:给对象在容器中提供给一个同样标志,主要用于声望兑换对象。
class:指定你类的全时间限制name属性,主要是用于反射创建战队对象。默认情况下动态创建无参构造函数。
scope:更改对象的作用范围。
二、Bean标签的属性
Bean标签中的scope属性,用于具体描述bean的作用域。取值如下:
singleton:默认值,单例的。代表在Spring Ioc容器中只能一个Bean实例。
prototype:多例的。每当从Spring容器中某些时都会直接返回个新的实例。
request:WEB项目中,Spring创建角色一个Bean的对象,将对象转存到request域中。
session:WEB项目中,Spring创建一个Bean的对象,将对象存进到session域中。
globalsession:WEB项目中,作用于集群环境(Porlet)的会话范围(全局会话范围)。假如没有集群环境(Portlet)这样globalSession等同于session。
init-method:指定类中的初始化方法名称。
destroy-method:委托类中全部销毁方法名称。
三、Bean标签的scope属性
scope属性t只能说明
单例singletont对象只创建家族两次,容器创建时创建角色
原型prototypet每动态创建两次就创建战队一个新的对象,对象全局函数时创建战队
requestt你每次HTTP跪请时创建一个实例
sessiont对于每个HTPPsession创建角色一个实例
1.测试scope“singleton”
singleton:默认值,单例的。代表在Spring Ioc容器中只能一个Bean实例。
lt?xmlversion#341.0#34encoding#34UTF-8#34?r26
ltbeansxmlns##34
txmlns:xsi##34
txsi:schemaLocation##34rlm
tltbeanid#34p#34class##34cgtlt/beangt
lt/beansgt
package
importorg.junit.Test
import
import
import
/**
*类只能证明:
*tt测试Bean标签的scope属性
*@guoqianliang1998.
*/
publicclassDemo{
tpublicvoidtestScope(){
ttApplicationContextacfutureClassPathXmlApplicationContext(#34applicationContext.xml#34)
ttPersonp1(Person)(#34p#34)
ttPersonp2(Person)(#34p#34)
ttPersonp3(Person)(#34p#34)
(p1)
(p2)
(p3)
t
“prototype”
prototype:多例的。每一道从Spring容器中查看时都会前往一个新的实例。
lt?xmlversion#341.0#34encoding#34UTF-8#34?a8
ltbeansxmlns##34
txmlns:xsi##34
txsi:schemaLocation##34rlm
tltbeanid#34p#34class##34scope#34prototype#34gtlt/beangt
lt/beansgt
package
importorg.junit.Test
import
import
import
/**
*类只能证明:
*tt测试Bean标签的scope属性
*@guoqianliang1998.
*/
welfareclassDemo{
tpublicvoidtestScope(){
ttApplicationContextacnewClassPathXmlApplicationContext(#34applicationContext.xml#34)
ttPersonp1(Person)(#34p#34)
ttPersonp2(Person)(#34p#34)
ttPersonp3(Person)(#34p#34)
(p1)
(p2)
(p3)
四、scope#34singleton#34受到的线程安全问题
单例模式下,在对象实体类的成员位置参与删削改,很有可能会演变成线程安全问题。
而写在函数内部(浅表位置)则绝对不会直接导致线程安全问题,这是而且对象在这一瞬间调用函数,都会在栈空间中开劈空间,函数执行完就后退,生命周期短。
package
import
import
/**
*类只能说明:
*tt实体类Person
*@guoqianliang1998.
*/
welfareclassPerson{
tprivateStringname
t//如果不是对list参与增删改,很可能诱发线程安全问题。
tpublicListltStringgt list new ArrayListltStringgt()
t//无参构造
tpublicPerson(){
t}
t//有参构造
tpublicPerson(String name){
name
t}
tpublicvoidtalks(){
(#34talk方法...#34)
t}
}
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。