2019-11-15 spring有几种自动装配模式

2019-11-15  本文已影响0人  小苏c

byName模式:在使用byName模式进行自动装配时,Spring会尝试用每个属性去上下文中适配同名的bean,例如有一个TestInject bean,该bean中有一个私有属性 OmsGoodsVo 并且 我们在ApplicationContext中也定义了名为 OmsGoodsVo这个bean,那么在TestInject初始化时OmsGoodsVo这个bean将会被自动分配给TestInject中的OmsGoodsVo属性。

byType模式:在使用byType模式进行自动装配时,Spring会尝试在Spring上下文中取寻找相同类型的bean去分配给目标bean的对应属性。

constructor构造函数模式:该模式和byType模式有异曲同工之妙,该模式通过bean的构造器进行注入而不是通过setter ,在该模式下Spring总是会尝试进行构造器最大入参的适配,例如TestInjectbean有两个构造器分别是TestInject1(String,Integer)  和TestInject2(String) 如果在ApplicationContext上下文中同时存在一个String bean和 Integer bean,那么Spring总是会去使用TestInject1去进行注入。

autodetect默认模式:Spring 将自动在构造函数模式和byType模式之间进行选择,选择的依据是如果bean存在一个默认的无参数构造函数则使用byType模式进行构造,否则用构造函数模式。

无(no):不使用任何模式,这是Spring的默认设置

在上面的配置中可以看见有两个空类 OmsGoodsVo 和 StockAllVo 并且同时命名为omsGoodsVo和stockAllVo ,同时有三个TestInject类来分别进行byTypebyNameconstructor的注入测试,设置lazy-init为true的目的是为了控制日志的打印位置并无其他作用

在上面这段代码中,可以看到TestInject类拥有三个构造函数和三个私有属性以及对应的setter方法和一个main方法,我们将通过getBean的方式来分别触发byName,byType,byConstructor注入模式。

可以看到byName模式下只自动注入了stockAllVo,这是符合我们期望的一个结果,因为在TestInject中只有stockAllVo能通过名称在ApplocationContext上下文中找到适配的bean,当使用byType模式时,spring自动装配了TestInject类中的所有三个属性,构造函数注入同样是符合期望的。

参考:https://www.jianshu.com/p/d8109ecd9bbe

上一篇下一篇

猜你喜欢

热点阅读