`

Spring知识整理(三)—— BeanFactory

阅读更多

Spring框架的核心就是IoC,而SpringIoC的实现是依靠容器的,Spring提供了两种IoC容器的实现,BeanFactoryApplicationContext

前者是一个基础的IoC容器,提供了完整的IoC服务支持,默认采用延迟初始化策略(当用户访问时才初始化)。而后者是在前者的基础上实现的,ApplicationContextBeanFactory进行了很多的扩充,而使用起来也更加方。便,所以在一般的应用中,ApplicationContext应该是更好的选择。

但这并不是完全否认了BeanFactory,毕竟ApplicationContext也必须实现这个接口。而且在一些资源有限,对功能要求不是很严格的场景BeanFactory还是比较合适的选择。所以在学习Spring的时候可以先从BeanFactory入手,一步步的了解SpringIoC容器。

 

我们知道,在Spring中,交由Spring管理的pojo会被配置成一个bean,而BeanFactory从字面理解就是一个bean的工厂。我们可以去查看BeanFactory接口的源码: 

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException;
    Object getBean(String name, Class requiredType) throws BeansException;
    /**
     * @since 2.5
    */
    Object getBean(String name, Object[] args) throws BeansException;
    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    /**
     * @since 2.0.3
    */
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    /**
     * @since 2.0.1
    */
    boolean isTypeMatch(String name, Class targetType) throws     NoSuchBeanDefinitionException;
    Class getType(String name) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);
}

 

其中最主要的方法就是getBean(StringClass),显而易见,我们可以通过这个方法从工厂中得到一个Bean来初始化我们的对象。而其他方法也可以通过名字知道其作用,都是得到或判断Bean的属性。

 

Ok,了解了BeanFactory方法之后,我们就可以使用它完成所谓的IoC,就是说对象的成员由BeanFactory为我们推送过来。

 

假设有以下一个pojo

package com.zrabbit.production; 

import java.util.List; 

import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 

import com.zrabbit.production.part.Engine; 
import com.zrabbit.production.part.Wheel; 

@SuppressWarnings(deprecation) 
public class Car 
{ 
    private Engine engine; 

    private List wheels; 

    public Engine getEngine() 
    { 
        return engine; 
    } 

    public void setEngine(final Engine engine) 
    { 
        this.engine = engine; 
    } 

    public List getWheels() 
    { 
        return wheels; 
    } 

    public void setWheels(final List wheels) 
    { 
        this.wheels = wheels; 
    } 

    public void showInfo() 
    { 
        engine.showInfo(); 
        for (final Wheel wheel : wheels) 
        { 
            wheel.showInfo(); 
        } 
    } 

    public void launch() 
    { 
        engine.launch(); 
    } 
}

 

内部的EngineWheel可以随意实现,然后在工程的classpath下有一个名字为beans.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

	<bean id="myCar" class="com.zrabbit.production.Car">
		<property name="engine" ref="engineOne" />
		<property name="wheels" >
			<list>
				<ref bean="wheelNumOne" />
				<ref bean="wheelNumOne" />
				<ref bean="wheelNumOne" />
				<ref bean="wheelNumOne" />
			</list>
		</property>
	</bean>
	
	<bean id="engineOne" class="com.zrabbit.production.part.EngineOne" />
	<bean id="wheelNumOne" class="com.zrabbit.production.part.WheelNumOne" />
</beans>

 

pojo和配置文件都有了,现在就需要使用BeanFactory将两者联系到一起完成IoC。我们可以找到BeanFactory的一个实现类:XmlBeanFactory,但当使用的时候会发现这个实现类已经废弃了,没关系,至少比没有强。

 

同时,XmlBeanFactory的构造器需要一个Resource参数(当然有两个构造器,另一个需要ResourceparentBeanFactory,这里我们不必关心parentBeanFactory),这个参数用于读取xml配置文件,我们可以通过其实现类ClassPathResource初始化这样一个对象。

 

现在,我们可以在Car类中写一个main方法来运行下这个简单的Spring程序:

    public static void main(final String[] args) 
    { 
        final Resource res = new ClassPathResource("beans.xml"); 
        final BeanFactory bf = new XmlBeanFactory(res); 
        final Car myCar = (Car) bf.getBean("myCar"); 
        myCar.showInfo(); 
  } 

 

很简单吧,通过代码我们也可以很清楚的看出BeanFactory的构建与使用过程,首先通过Resource类将配置文件的路径告诉给XmlBeanFactory,然后XmlBeanFactory在这个文件中寻找到idmyCarbean,根据bean内的信息初始化出我们要的对象。

 

那么在XmlBeanFactory中做了些什么呢,我们可以去查看这个类的源码。我们发现,XmlBeanFactory继承自DefaultListableBeanFactory,这个父类是一个很古老(2001年就存在了),并且很重要(ApplicationContext中也会用到它)的IoC容器实现,BeanFactoryIoC功能主要来源于这个类,有兴趣可以去看下。

 

我们还是主要关注XmlBeanFactory中的东东,这个类中有一个成员叫做XmlBeanDefinitionReader,通过名字就可以看出这货是用来读我们的XML文件的,它的构造器将XmlBeanFactory本身传入(this),其实这正需要的是其父类DefaultListableBeanFactory,这里就多说两句吧,DefaultListableBeanFactory间接地实现了BeanFactory接口,并且还实现了BeanDefinitionRegistry接口,该接口是在BeanFactory的实现中担当Bean注册管理的角色(说简单点就是让你写在XML中的bean真正的成为一个bean并保存下来XmlBeanFactory的构造方法也非常简单,就是直接用上面说到的reader去加载传入的Resource

 

Ok,说了这么多,也应该清楚了BeanFactory的执行过程了,我们可以自己尝试实现一个BeanFactory

1. 创建IoC抽象资源,就是那个Resource

2. 创建一个DefaultListableBeanFactory,因为需要它完成Bean注册及BeanFactory主要功能。

3. 创建一个XmlBeanDefinitionReader,将DefaultListableBeanFactory传入。

4. XmlBeanDefinitionReader对象读取Resource

分享到:
评论

相关推荐

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    Spring源码学习三:BeanFactory解析1

    在Spring框架中,BeanFactory是核心的IoC(Inversion of Control)容器接口,它负责管理和维护Bean的生命周期。BeanFactory提供了对Bean的创建、初始化、销毁等操作的支持,是Spring容器的基础。当我们通过XML、Java...

    Spring中ApplicationContext和beanfactory区别.rar

    在Spring框架中,ApplicationContext和BeanFactory是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入学习和使用Spring至关重要。 首先,BeanFactory是Spring中最基础的bean管理容器,它...

    简单模拟Spring的beanFactory

    在Java世界中,Spring框架是应用最广泛的IoC(Inversion of Control)和...同时,了解这些基础知识也为理解和使用Spring的其他组件,如`ApplicationContext`、`Prototype`作用域、`@Autowired`注解等打下了坚实的基础。

    Spring的IoC容器之BeanFactory[定义].pdf

    Spring的IoC容器是其核心特性之一,它通过BeanFactory和ApplicationContext两个主要接口来实现控制反转(Inversion of Control,IoC)的概念。BeanFactory作为基础的IoC容器,提供了全面的IoC服务,包括对象的注册、...

    Spring————面试题库

    Spring提供了三种配置方式:基于XML的配置、基于注解的配置和基于Java的配置。基于XML的配置方式需要在配置文件中声明bean,依赖和服务的配置,这样的配置方式有利于将配置信息和代码分离。 在Spring框架中,通常会...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    三、Spring源码分析——ApplicationContext

    《Spring源码分析——ApplicationContext》 在Java世界中,Spring框架是不可或缺的一部分,它以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,极大地...

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起来整个过程)

    spring中的BeanFactory解析xml文件

    在Spring框架中,BeanFactory是核心的容器,它负责管理和装配应用中的对象,即bean。当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将...

    Spring的BeanFactory的接口源码中文解释

    Spring的BeanFactory的接口的中文解释

    Spring特性——Aware感知特性

    下面我们将深入探讨Spring的Aware感知特性及其相关知识点。 1. **BeanFactoryAware** BeanFactoryAware接口提供了一个方法`setBeanFactory(BeanFactory beanFactory)`,允许bean获取到当前的BeanFactory实例。这样...

    spring之beanfactory

    spring之beanfactory 的一些基本知识与其关系使用

    day38 05-Spring的BeanFactory与ApplicationContext区别

    在Spring框架中,BeanFactory和ApplicationContext是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入掌握Spring框架至关重要。 首先,BeanFactory是Spring中最基本的bean容器,它提供了对...

    BeanFactory的实例化

    Spring 3 中提供了三种实例化 BeanFactory 的方法,下面将详细介绍这三种方法。 第一种方法:从文件系统资源实例化 BeanFactory 在 Spring 项目中,可以从文件系统资源实例化 BeanFactory,这种方法可以使得 ...

    spring的核心思想

    #### 四、Spring的核心组件——BeanFactory与ApplicationContext 1. **BeanFactory**:它是Spring框架中最基本的容器接口,负责创建和管理Bean实例。BeanFactory通过工厂模式为应用程序提供服务,允许应用程序请求...

    Spring的BeanFactory的接口注解

    ### Spring的BeanFactory的接口注解 #### 一、引言 在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心...

    简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...

    Spring in Action 3rd Edition Craig Walls

    2. **核心容器**:详细阐述了Spring框架的核心容器——BeanFactory和ApplicationContext的工作原理,以及如何使用它们来管理应用程序中的对象。 3. **依赖注入(DI)**:解释了依赖注入的基本概念及其在Spring中的...

    Spring——jar包详解

    总的来说,掌握Spring框架的jar包知识对于Java开发者来说至关重要,它不仅能提升开发效率,也能帮助你构建出更稳定、可维护的系统。通过深入学习Spring的源码,你还能提升自己的编程技巧,更好地理解和解决问题。

Global site tag (gtag.js) - Google Analytics