《Pro Spring》学习笔记之beanFactory的嵌套使用

本文探讨了Spring中BeanFactory的嵌套使用,通过拆分配置文件并利用bean工厂的“继承”机制,实现配置的模块化。尽管无法直接通过子bean工厂获取父工厂的bean,但这种方法仍能有效组织和管理Spring应用的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring支持BeanFactory的嵌套使用,我们可以把一个大的配置文件拆分成多个配置文件,然后参考面向对象的继承机制,进行配置文件的“继承”,当嵌套bean工厂时,Spring允许其中的beans讲字工厂作为父工厂的参考bean,唯一缺点是这只能在配置文件中使用,调用子bean工厂的getBean来访问父工厂的一个bean是不可能的 

嵌套BeanFacotry

 

realpathParent=System.getProperty("user.dir")+File.separator+"src"+File.separator+"ch4_BeanFactoryIterator"+File.separator+"applicationContext-parent.xml";
realpathChild=System.getProperty("user.dir")+File.separator+"src"+File.separator+"ch4_BeanFactoryIterator"+File.separator+"applicationContext-child.xml"
XmlBeanFactory  parentFactory=new XmlBeanFactory(new FileSystemResource(realpathParent));
 XmlBeanFactory  factory
=new XmlBeanFactory(new FileSystemResource(realpathChild),parentFactory);

 

applicationContext-parent.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
    
xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="injectBean" class="java.lang.String">
 
<constructor-arg>
   
<value>Bean in Parent</value>
 
</constructor-arg>
</bean>

<bean id="injectBeanParent" class="java.lang.String">
 
<constructor-arg>
   
<value>Bean in Parent</value>
 
</constructor-arg>
</bean>
</beans>

 

applicationContext-child.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
    
xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<!-- 应用父bean的injectBeanParent -->
<bean id="target1" class="ch4_BeanFactoryIterator.SimpleTarget">
  
<property name="val">
    
<ref bean="injectBeanParent"/>
  
</property>
</bean>
<!-- 应用子bean重写的injectBean -->
<bean id="target2" class="ch4_BeanFactoryIterator.SimpleTarget">
  
<property name="val">
    
<ref bean="injectBean"/>
  
</property>
</bean>
<!-- 强制引用父bean的injectBean -->
<bean id="target3" class="ch4_BeanFactoryIterator.SimpleTarget">
  
<property name="val">
    
<ref parent="injectBean"/>
  
</property>
</bean>


<!-- 重写injectBean -->
<bean id="injectBean" class="java.lang.String">
 
<constructor-arg>
   
<value>Bean in Child</value>
 
</constructor-arg>
</bean>


</beans>

SimpleTarget.java

 

package ch4_BeanFactoryIterator;

public class SimpleTarget {
  
private String val;

public String getVal() {
    
return val;
}


public void setVal(String val) {
    
this.val = val;
}

}

 

完整测试代码:

 

package ch4_BeanFactoryIterator;

import java.io.File;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;



public class TestSpring {
  
public static void main(String args[])  throws Exception{
      
//获取bean factory
      BeanFactory factory=(BeanFactory)getBeanFactory();  //使用子beanFactory
      SimpleTarget target1=(SimpleTarget)factory.getBean("target1");
      SimpleTarget target2
=(SimpleTarget)factory.getBean("target2");
      SimpleTarget target3
=(SimpleTarget)factory.getBean("target3");
      System.out.println(target1.getVal());
      System.out.println(target2.getVal());
      System.out.println(target3.getVal());
      
      
  }

  
public static BeanDefinitionRegistry getBeanFactory() {
      
//获取bean factory
      String realpathParent="";
      String realpathChild
="";
         
//加载配置项
      realpathParent=System.getProperty("user.dir")+File.separator+"src"+File.separator+"ch4_BeanFactoryIterator"+File.separator+"applicationContext-parent.xml";
      realpathChild
=System.getProperty("user.dir")+File.separator+"src"+File.separator+"ch4_BeanFactoryIterator"+File.separator+"applicationContext-child.xml"
      XmlBeanFactory  parentFactory
=new XmlBeanFactory(new FileSystemResource(realpathParent));
      XmlBeanFactory  factory
=new XmlBeanFactory(new FileSystemResource(realpathChild),parentFactory);
      
      
return factory;
  }

}

 

运行结果

Bean in Parent
Bean in Child
Bean in Parent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值