spring中beanFactory和ApplicationContext的联系和区别

Spring系列之beanFactoryApplicationContext

一、BeanFactory

BeanFactory  Spring 心脏。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 来实例

化、配置和管理 Bean

BeanFactory:是IOC容器的核心接口, 它定义了IOC的基本功能,我们看到它主要定义了getBean

法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。方法的功能是返回特定的名称的

Bean

BeanFactory 是初始化 Bean 和调用它们生命周期方法的吃苦耐劳者。注意,BeanFactory 只能管理

单例(SingletonBean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为

原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。

BeanFactory有着庞大的继承、实现体系,有众多的子接口、实现类。来看一下BeanFactory的基本类体

系结构(接口为主):

这是我画的BeanFactory基本的类体系结构,这里没有包括强大的ApplicationContext体系。

具体:

1BeanFactory作为一个主接口不继承任何接口,暂且称为一级接口

2、有3个子接口继承了它,进行功能上的增强。这3个子接口称为二级接口

3ConfigurableBeanFactory可以被称为三级接口,对二级接口HierarchicalBeanFactory进行了

再次增强,它还继承了另一个外来的接口SingletonBeanRegistry

4ConfigurableListableBeanFactory是一个更强大的接口,继承了上述的所有接口,无所不包,

称为四级接口

(这4级接口是BeanFactory的基本接口体系。继续,下面是继承关系的2个抽象类和2个实现类:)

5AbstractBeanFactory作为一个抽象类,实现了三级接口ConfigurableBeanFactory大部分功

能。6AbstractAutowireCapableBeanFactory同样是抽象类,继承自AbstractBeanFactory,并额外

实现了二级接口AutowireCapableBeanFactory

7DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory,实现了最强大的

四级接口ConfigurableListableBeanFactory,并实现了一个外来接口BeanDefinitionRegistry,它并非

抽象类。

8、最后是最强大的XmlBeanFactory,继承自DefaultListableBeanFactory,重写了一些功能,使

自己更强大。

总结:

BeanFactory的类体系结构看似繁杂混乱,实际上由上而下井井有条,非常容易理解。

再来看一下BeanFactory的源码:

package org.springframework.beans.factory;

public interface BeanFactory {

/**

* 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为

a,那么,&a会得到那个Factory

*/

String FACTORY_BEAN_PREFIX = "&";

/*

* 四个不同形式的getBean方法,获取实例

*/

Object getBean(String name) throws BeansException;

<T> T getBean(String name, Class<T> requiredType) throws BeansException;

<T> T getBean(Class<T> requiredType) throws BeansException;

Object getBean(String name, Object... args) throws BeansException;

boolean containsBean(String name); // 是否存在

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否

为单实例

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否

为原型(多实例)

boolean isTypeMatch(String name, Class<?> targetType)

throws NoSuchBeanDefinitionException;// 名称、类型是否匹配

Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类

String[] getAliases(String name);// 根据实例的名字获取实例的别名

}具体:

14个获取实例的方法。getBean的重载方法。

24个判断的方法。判断是否存在,是否为单例、原型,名称类型是否匹配。

31个获取类型的方法、一个获取别名的方法。根据名称获取类型、根据名称获取别名。一目了

然!

总结:

10个方法,很明显,这是一个典型的工厂模式的工厂接口。

BeanFactory最常见的实现类为XmlBeanFactory,可以从classpath或文件系统等获取资源。

1File 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);

XmlBeanFactory可以加载xml的配置文件。假设我们有一个Car类:

package spring.ioc.demo1;

public class Car {

private String brand;

private String color;

private int maxSpeed;

public String getBrand() {

return brand;

}

public void setBrand(String brand) {

this.brand = brand;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public int getMaxSpeed() {

return maxSpeed;

}

public void setMaxSpeed(int maxSpeed) {

this.maxSpeed = maxSpeed;

}

public String toString(){return "the car is:"+ getBrand() + ", color is:" +getColor() +", maxspeed

is:"+getMaxSpeed();

}

public Car() {

}

public Car(String brand, String color, int maxSpeed) {

this.brand = brand;

this.color = color;

this.maxSpeed = maxSpeed;

}

public void introduce() {

System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:"

+ maxSpeed);

}

}

我们通过在applicationContext.xml中配置:

<bean id="car1" class="spring.ioc.demo1.Car"

p:brand="spring注入-红旗001"

p:color="spring注入-紫色"

p:maxSpeed="520" />

通过XmlBeanFactory实现启动Spring IoC容器:

public static void main(String[] args) {

ResourcePatternResolver resolver = new

PathMatchingResourcePatternResolver();

Resource res = resolver.getResource("classpath:applicationContext.xml");

BeanFactory factory = new XmlBeanFactory(res);

//ApplicationContext factory=new

ClassPathXmlApplicationContext("applicationContext.xml");

Car car = factory.getBean("car1",Car.class);

System.out.println("car对象已经初始化完成");

System.out.println(car.getMaxSpeed());

}

1. XmlBeanFactory通过Resource装载Spring配置信息冰启动IoC容器,然后就可以通过

factory.getBeanIoC容器中获取Bean了。

2. 通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一

个调用时。

3. 对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean

时直接从IoC容器缓存中获取Bean二、ApplicationContext

如果说BeanFactorySpring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext

BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的

方式实现,而在ApplicationContext中则可以通过配置实现。

BeanFactorty接口提供了配置框架及基本功能,但是无法支持springaop功能和web应用。而

ApplicationContext接口作为BeanFactory的派生,因而提供BeanFactory所有的功能。而且

ApplicationContext还在功能上做了扩展,相较于BeanFactortyApplicationContext还提供了以下的

功能:

1MessageSource, 提供国际化的消息访问

2)资源访问,如URL和文件

3)事件传播特性,即支持aop特性

4)载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web

ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了

容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、

ApplicationEventPublisher(应用事件发布接口)等。

三、二者区别

1.BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean(调用getBean()),才

对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而

ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我

们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactoryApplicationContext 唯一的不足

是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用

getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属

性是否注入;所以通常情况下我们选择使用 ApplicationContext

应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时

候,你就不用等待,因为它们已经创建好了。

2.BeanFactoryApplicationContext都支持BeanPostProcessorBeanFactoryPostProcessor的使

用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

Applicationcontext beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要

通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean  Applicationcontext 直接

配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 )

3.beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面

对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory

四、总结

作用:

\1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责

bean的声明周期。

\2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

a. 国际化支持

b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”),

“file:c:/config.properties”

c. 事件传递:通过实现ApplicationContextAware接口

\3. 常用的获取ApplicationContextFileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或

文件名数组,有相对路径与绝对路径。

ClassPathXmlApplicationContext:从classpathxml配置文件创建,可以从jar包中读取配置文件。

ClassPathXmlApplicationContext 编译路径总有三种方式:

XmlWebApplicationContext:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现或这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红红火火a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值