Spring文档描述了由Ioc容器管理的bean默认情况下是隐式预示例化的,而不是将它们指定为lazy-initialized。我定义了一个子bean定义A,它从父bean定义B继承配置数据。它们都有一个在元素上指定的属性。然后我通过Ioc容器检索了bean A的示例,发现Ioc容器刚刚调用了bean A的初始化方法。为什么Ioc容器没有调用启动时示例化的bean B的初始化方法?
<bean id="student" class="com.ford.spring.pojo.Student" lazy-init="true" init-method="init">
<property name="age" value="20"/>
<property name="gender" value="male"/>
<property name="name" value="porro"/>
<property name="id" value="1"/>
</bean>
<bean id="player"
class="com.ford.spring.pojo.Player"
parent="student" init-method="init" destroy-method="destroy">
<property name="nationality" value="Italy"/>
</bean>
ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext("config-metadata.xml");
Player player = (Player) applicationContext.getBean("player");
applicationContext.close();
System.out.println(player);
为什么Ioc容器没有调用启动时示例化的bean B的初始化方法?
1条答案
按热度按时间nr9pn0ug1#
据此:
子bean定义从父bean继承作用域、构造函数参数值、属性值和方法重写,并可以选择添加新值。您指定的任何作用域、初始化方法、销毁方法或静态工厂方法设置都会覆盖相应的父级设置。
因此,首先,只有当子bean的
init-method
不同于父bean时,才有意义配置子bean的init-method
。如果子bean和父bean具有相同的init-method
,则不需要在子bean上配置init-method
。第二,初始化方法是否执行父初始化方法是它的实现细节,从bean定义的Angular 来看,它并不关心它。它只关心你告诉它什么是初始化方法,这样它就可以在创建一个bean示例后简单地执行它,仅此而已。
因此,如果您希望
Player
的初始化方法执行其父进程的init。方法,可以将其实现为:否则,您可以将其实现为: