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
相关产品推荐
相关产品推荐

