Spring中bean的生命周期回调问题

u3r8eeie  于 2023-10-15  发布在  Spring
关注(0)|答案(1)|浏览(126)

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的初始化方法?

nr9pn0ug

nr9pn0ug1#

据此:
子bean定义从父bean继承作用域、构造函数参数值、属性值和方法重写,并可以选择添加新值。您指定的任何作用域、初始化方法、销毁方法或静态工厂方法设置都会覆盖相应的父级设置。
因此,首先,只有当子bean的init-method不同于父bean时,才有意义配置子bean的init-method。如果子bean和父bean具有相同的init-method,则不需要在子bean上配置init-method
第二,初始化方法是否执行父初始化方法是它的实现细节,从bean定义的Angular 来看,它并不关心它。它只关心你告诉它什么是初始化方法,这样它就可以在创建一个bean示例后简单地执行它,仅此而已。
因此,如果您希望Player的初始化方法执行其父进程的init。方法,可以将其实现为:

public class Player extends Student{

   
  void init(){
     super.init();
     //do other player initialisation codes here..
  }

}

否则,您可以将其实现为:

public class Player extends Student{

   
  void init(){
     //do player initialisation codes here..
  }

}

相关问题