BeanFactory类

引用:在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现 (如针对web应用的WebApplicationContext)。简单说, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。

• XmlBeanFactoryBeanFactory实现,提供基本的IoC容器功能,可以从classpath或文件系统等获取资源;

  (1)  File file = new File("fileSystemConfig.xml");

           Resource resource = new FileSystemResource(file);

           BeanFactory beanFactory = new XmlBeanFactory(resource);

  (2)

          Resource resource = new ClassPathResource("classpath.xml");                 

          BeanFactory beanFactory = new XmlBeanFactory(resource);

• ClassPathXmlApplicationContextApplicationContext实现,从classpath获取配置文件;

         BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");

• FileSystemXmlApplicationContextApplicationContext实现,从文件系统获取配置文件。

 

         BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystemConfig.xml");

 

首先,XmlBeanFactory的源码如下,其中 XmlBeanDefinitionReader来处理xml文件,注意,这里this是将BeanFactor对象作为参数传入XmlBeanDefinitionReader(解析xml)中,便于后期解析xml时将解析后的BeanDefinition(用于bean实例化)放入BeanFactory:

Resource类有关详细讲解可参考:http://jinnianshilongnian.iteye.com/blog/1416319

public class XmlBeanFactory extends DefaultListableBeanFactory {
	private final XmlBeanDefinitionReader reader;

	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, (BeanFactory) null);
	}

	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory)
			throws BeansException {
		super(parentBeanFactory);
		this.reader = new XmlBeanDefinitionReader(this);
		this.reader.loadBeanDefinitions(resource);
	}
}

 接下来看怎么处理的:

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
        public int loadBeanDefinitions(Resource resource)
			throws BeanDefinitionStoreException {
		return this.loadBeanDefinitions(new EncodedResource(resource));
	}

        public int loadBeanDefinitions(EncodedResource encodedResource)
			throws BeanDefinitionStoreException {
		//...
                 arg4 = this.doLoadBeanDefinitions(inputSource,
							encodedResource.getResource());
                //...
	}


        protected int doLoadBeanDefinitions(InputSource inputSource,
			Resource resource) throws BeanDefinitionStoreException {
		try {
			Document ex = this.doLoadDocument(inputSource, resource);
			return this.registerBeanDefinitions(ex, resource);
		} catch (Exception arg3) {
			throw arg3;
		} 
	}

        public int registerBeanDefinitions(Document doc, Resource resource)
			throws BeanDefinitionStoreException {
		BeanDefinitionDocumentReader documentReader = this
				.createBeanDefinitionDocumentReader();
		int countBefore = this.getRegistry().getBeanDefinitionCount();
		documentReader.registerBeanDefinitions(doc,
				this.createReaderContext(resource));
		return this.getRegistry().getBeanDefinitionCount() - countBefore;
	}
}

 而这个时候,DefaultBeanDefinitionDocumentReader(处理xml)的实例,专门负责解析xml:

public class DefaultBeanDefinitionDocumentReader implements
		BeanDefinitionDocumentReader {
	public static final String BEAN_ELEMENT = "bean";
	public static final String NESTED_BEANS_ELEMENT = "beans";
	public static final String ALIAS_ELEMENT = "alias";
	public static final String NAME_ATTRIBUTE = "name";
	public static final String ALIAS_ATTRIBUTE = "alias";
	public static final String IMPORT_ELEMENT = "import";
	public static final String RESOURCE_ATTRIBUTE = "resource";
	public static final String PROFILE_ATTRIBUTE = "profile";
        //......
}

 

猜你喜欢

转载自1181731633.iteye.com/blog/2342159
今日推荐