Spring配置子类Bean时,父类Address是否会被创建为Bean?
关于Spring父类Bean创建的问题解答
嗨,作为Spring新手,这个问题其实挺典型的,我来给你掰扯清楚~
核心结论
Spring不会单独为父类Address创建Bean。你在配置文件里只声明了OfficeAddress的Bean,Spring只会实例化这个子类的Bean;而父类Address的构造方法被调用,只是Java继承机制的必然结果——创建子类对象时,Java会自动先调用父类的无参构造方法,这和Spring是否创建父类Bean是完全两回事。
验证方法
方法1:观察控制台输出
运行你的TestClasspathApplicationContext,控制台会输出:
Inside Address Constructor Inside OfficeAddress Constructor Printing all the details of office address .....
这里父类构造的输出只是Java继承的表现,并不是Spring单独创建了Address的Bean。
方法2:尝试从容器获取Address类型的Bean
修改你的main方法,添加获取AddressBean的测试代码:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpathapplicationcontext.xml"); Address offaddress = context.getBean("officeaddress", OfficeAddress.class); offaddress.printAllDetails(); // 尝试获取Address类型的Bean try { Address addressBean = context.getBean(Address.class); System.out.println("成功获取到Address Bean"); } catch (NoSuchBeanDefinitionException e) { System.out.println("容器中不存在Address类型的Bean:" + e.getMessage()); } }
运行后会抛出NoSuchBeanDefinitionException,明确告诉你容器里根本没有Address的Bean实例。
方法3:打印容器中所有Bean的名称
同样修改main方法,添加打印所有Bean定义名称的代码:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpathapplicationcontext.xml"); // 打印容器中所有Bean的名称 String[] beanNames = context.getBeanDefinitionNames(); System.out.println("容器中的Bean列表:"); for (String name : beanNames) { System.out.println("- " + name); } Address offaddress = context.getBean("officeaddress", OfficeAddress.class); offaddress.printAllDetails(); }
运行后只会输出officeaddress这一个Bean名称,直接证明Spring没有创建Address的独立Bean。
补充说明
如果确实需要Spring为Address创建独立的Bean,你需要在配置文件里单独声明它:
<bean id="address" class="com.springprct.ioc.applicationcontext.classpathsystem.Address"/>
这时Spring才会把Address也作为一个独立的Bean管理起来。
内容的提问来源于stack exchange,提问作者Faysal
相关产品推荐
相关产品推荐

