2016 - 2024

感恩一路有你

springbean初始化流程图 Spring如何解决循环依赖的问题?

浏览量:3160 时间:2023-06-11 22:04:44 作者:采采

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}

}

对象 Bean scope viewplain 属性

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。