You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring父子Bean初始化方法疑问:为何父Bean初始化方法未执行?

为什么父Bean的初始化方法未被调用?

这事儿得从Spring Bean定义继承的本质说起:

  • Bean定义继承≠实例继承:你用<bean parent="student">只是让player这个Bean复用student的配置(比如age、name这些属性值),但容器不会因为子Bean的实例化就去创建父Bean的实例。父Bean的init-method是绑定在它自己的实例生命周期上的,只有当容器真正实例化student这个Bean时才会触发。
  • lazy-init的限制:你给student设了lazy-init="true",容器启动时不会预实例化它,而且你的代码里只获取了player,完全没碰student这个Bean,所以父Bean的初始化方法根本没机会执行。
  • 子Bean的初始化独立:player自己配置了init-method="init",所以获取它的实例时会执行这个方法,但这和父Bean的init-method是两码事——除非你的Player类在Java层面继承了Student,并且在自己的init方法里主动调用父类的init,否则父类的初始化逻辑不会自动跑起来。

验证方法

如果在代码里加一行:

applicationContext.getBean("student");

你就会看到父Bean的init-method被调用了,因为这时候容器才实例化了student这个Bean。

你的配置与代码

XML配置:

<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>

Java代码:

ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext("config-metadata.xml");
Player player = (Player) applicationContext.getBean("player");
applicationContext.close();
System.out.println(player);

内容的提问来源于stack exchange,提问作者Ford Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:22:45