深入Spring专题(25)

158 阅读2分钟

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

创建bean时执行方法

每个bean的标记都有一个init-method属性,它告诉Spring,只要完成bean的配置,就应该调用init()方法,singerOne bean具有name和age属性的值,因此通过init()方法没有进行任何更改,singerTwo bean针对name属性没有任何值,这意味着在init()方法中,name属性将赋予默认值,最后,singerThree bean针对age属性没有任何值,init()方法中定义的逻辑将其视为错误,因此会抛出IllegalArgumentException异常。还要注意,在标记中,添加属性default-lazy-init="true"来指示Spring仅在应用程序请求bean时才实例化配置文件中定义的bean。如果没有指定该属性,那Spring将尝试在启动ApplicationContext的过程中初始化所有的bean,并且在singerThree初始化期间将失效。

​ 当配置文件中的所有bean具有相同的init-method配置时,可通过在元素上设置default-init-method属性来简化该文件,bean可以是不同的类型,唯一的条件是拥有一个名为default-init-method属性值的方法。所以配置文件如下

<beans  ... default-lazy-init="true" default-init-method="init">
    <bean id="singerOne" class="com.ozx.Singer" init-method="init" p:name="shiyi" p:age="18"/>
    <bean id="singerTwo" class="com.ozx.Singer" init-method="init" p:age="28"/>
    <bean id="singerThree" class="com.ozx.Singer" init-method="init" p:name="eleven"/>
</beans>

运行上述的代码,控制台输出如下结果:

Initializing bean
	Name:shiyi
	Age:18
Initializing bean
Using default name
	Name:ozx
	age:28
Initializing bean
	必须先填充age属性的值

从结果可以看出,使用配置文件中指定的值配置了singerOne,对于singerTwo来说,因为没有在配置中指定值,使用name属性的默认值,最后对于singerThree没有创建bean实例,因为init()方法由于缺少age属性的值而引发了错误。

使用初始化方法是确保bean正确配置的理想方法。通过使用这种机制,可充分利用IoC的优势,而不会失去通过手动定义依赖项获得的任何控制权。初始化方法的唯一限制是不能接收任何参数,可定义任何返回类型,虽然返回值会被Spring忽略,甚至可以使用静态方法,但也不能接收任何参数。