深入Spring专题(21)

243 阅读2分钟

这是我参与2022首次更文挑战的第28天,活动详情查看2022首次更文挑战

自动装配Bean

Spring支持五种自动装配模式

  • byName模式:当使用byName模式进行自动装配时,Spring会尝试将每个属性连接到同名的bean,因此,如果目标bean具有名为gxin属性并且在ApplicationContext中定义了gxin bean,那gxin bean将被分配给目标bean的gxin属性。
  • byType模式:当使用byType进行自动装配时,Spring通过在ApplicationContext中自动使用相同类型的bean来尝试连接目标bean模式的每个属性。
  • 构造函数模式:该模式与byType模式在功能上是相同的,只不过使用构造函数而不是setter来执行注入,Spring匹配构造函数中最大数量的参数。所以,如果bean有两个构造函数,一个接收一个String,另一个接收一个String和一个Long,并且ApplicationContext中有一个String和一个Long bean,那Spring将使用带有两个参数的构造函数。
  • 默认情况:Spring将自动在构造函数模式和byType模式之间进行选择,如果bean有一个默认的构造函数,那么Spring使用byType模式,否则,就使用构造函数模式。
  • 无:默认设置。

如果在目标bean上有一个String类型的属性,而在ApplicationContext中有一个String类型的bean,那Spring会将这String bean连接到目标bean的String属性,如果在同一个ApplicationContext实例中有多个相同类型的bean,那Spring将无法决定哪一个用于自动装配,并引发异常(类型为org.springframework.beans.factory.NoSuchBeanDefinitionException)

使用每种模式来自动连接相同类型的三个bean

<beans ...>
	<bean id="fooOne" class="com.ozx.Foo"/>
    <bean id="barOne" class="com.ozx.Foo"/>
    <bean id="targerByName" class="com.ozx.target" autowired="byName" lazy-init="true"/>
     <bean id="targerByType" class="com.ozx.target" autowired="byType" lazy-init="true"/>
     <bean id="targerConstructor" class="com.ozx.target" autowired="constructor" lazy-init="true"/>
</beans>

Foo和Bar是空类,针对autowire属性,每个Target bean都有不同的值,lazy-init属性被设置为true,Spring仅在第一次请求时才实例化bean,而不是在启动时实例化,以便可将结果输出到正确位置。