引用:在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。
• XmlBeanFactory:BeanFactory实现,提供基本的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);
• ClassPathXmlApplicationContext:ApplicationContext实现,从classpath获取配置文件;
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");
• FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。
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"; //...... }
相关推荐
然后,我们需要编写BeanFactory类,该类用于管理和创建对象。BeanFactory类的代码如下所示: ``` import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; ...
1. **Bean定义**:在Spring中,每个bean都有一个定义,包含它的类、依赖关系、初始化方法等信息。这些信息通常写在XML配置文件中,但也可以通过注解或编程方式定义。 2. **bean的实例化**:`BeanFactory`根据bean...
这个步骤涉及到了BeanDefinition类,它用于保存Bean及其配置信息,以及BeanFactory类,负责管理Bean的生命周期。 #### step-2:抽象BeanFactory和Bean初始化 第二个步骤是管理Bean的生命周期。通过创建抽象类...
此外,ApplicationContext还能够从多种类型的配置源(如XML、Java配置类、注解等)加载bean定义,使得配置更加灵活。 在实际应用中,通常推荐使用ApplicationContext,因为它更适合复杂的项目需求。然而,在内存...
Application Context模块建立在核心容器之上,扩展了BeanFactory类,添加了一些别的应用支持,比如I18N、应用生命周期事件等。 AOP模块支持应用对象之间的松耦合,DI也是我们开发程序时一直追求的方式。JDBC抽象及...
1. **核心容器**:Spring的核心容器由BeanFactory类提供基础,它是所有Spring组件的基础。BeanFactory负责管理对象(beans)的生命周期和依赖关系,实现了依赖注入(Dependency Injection, DI)的基本原理。 2. **...
n 源码分析-BeanFactory类视图和常用工厂说明 n 源码分析-AnnotationConfigApplicationContext的register方法 n 源码分析-AnnotationConfigApplicationContext的scan方法 n 源码分析-AbstractApplicationContext的...
在测试工程中,"test"目录下的文件可能是测试类或者配置文件,用于验证BeanFactory管理和依赖注入的功能是否正常工作。这些测试可能包括对bean的创建、属性注入、依赖关系的检查,以及不同实现间的切换等场景。 总...
可被eclipse直接导入的Spring源码,Spring的BeanFactory类
BeanFactory的实现类有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,它们分别从不同的维度扩展了BeanFactory的功能。 BeanFactory的主要方法包括: * getBean(String name):根据Bean的...
在Spring框架中,实现BeanFactory接口的主要类是DefaultListableBeanFactory,它是最基础的IoC容器。 XML配置文件是Spring中定义bean及其依赖关系的传统方式。一个典型的Spring XML配置文件会包含若干个元素,每个...
XML配置需要在配置文件中显式声明bean及其依赖关系,而注解配置则是在类或方法上使用如@Service、@Component、@Autowired等注解,让Spring自动扫描并管理bean。这两种方式各有优劣,XML配置更加灵活,适合复杂场景,...
- **功能**: 返回`BeanFactory`使用的类加载器,该类加载器通常用于加载Bean定义中的类。 - **返回值**: 类加载器对象。 - **应用场景**: 当需要确保Bean定义与实际Bean实例的类加载器一致时使用。 ##### 4. `void ...
在 Spring 中,BeanFactory 是一个工厂类(接口),用于实例化和管理 Bean。它提供了许多方法来管理 Bean,包括 getBean()、containsBean()、isSingleton() 等。 FactoryBean 是 Spring 中的一种特殊的 Bean,它...
DefaultListableBeanFactory还继承了`DefaultSingletonBeanRegistry`,这是一个内部类,专门负责管理单例Bean。它维护了一个单例对象的缓存,确保每次请求同一个单例Bean时返回的是同一个实例。同时,`...
BeanFactory类用于读取配置文件,根据配置创建相应的对象。 在配置文件中,我们可以定义要加载的类和对应的通知实现类。 例如,在配置文件中,我们可以定义xxx=java.util.ArrayList,xxx.advice=...
SpringContext模块继承BeanFactory类,并且添加了事件处理、国际化、资源装载、透明装载、以及数据校验等功能。它还提供了框架式的Bean的访问方式和许多企业级的功能,如JNDI访问、支持EJB、远程调用、集成模板框架...
1、Utils工具类有String工具类、XmlNode节点工具类、BeanFactory相关、Common工具类、Cookie工具类、Date工具类、Http工具类、JDBC工具类、日志Log工具类、Servlet相关等。2、工具类省了重复造轮子的工作,可以直接...
本文将详细介绍Spring中获取ApplicationContext对象的工具类实现方法。 在Spring中,典型的获取ApplicationContext对象的方式是使用ApplicationContext接口的一个实现类,如ClassPathXmlApplicationContext。这是一...