Spring框架学习(四)

         本篇主要对Spring的BeanFactory和ApplicationContext以及FactoryBean进行讲解。

一.BeanFactory与ApplicationContext

   所谓控制反转(IOC),就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。

   IOC容器最核心的接口是BeanFactory,但是说IOC就是BeanFactory是不正确的,它还有其它的三个接口共同定义了Bean的集合,Bean之间的关系以及Bean的行为,它的作用类似于java的object类,spring bean的创建就是典型的工厂模式。为什么这么说呢,在BeanFactory里,只对IOC容器的基本行为作了定义,根本不关心你的bean是如何定义加载的。正如我们只关心工厂里得到什么产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。 xmlBeanFacory是beanfactory的实现。

   ApplicationContext是spring提供的一个高级的IOC容器,它除了能够提供IOC容器的基本功能外,还为用户提供了1.支持信息员,可以实现国际化。2.访问资源。3.支持应用事件。可以这么说,如果BeanFactory是心脏,那么ApplicationContext就是完整的身躯。

二者的不同点:

1.通过BeanFactory启动IOC容器时,并不会初始化配置文件中定义的bean。初始化动作发生在第一个调用时,对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean()获取Bean时,将直接从IOC容器的缓存中获取Bean实例。

ApplicationContext在初始化应用上下文时就实例化所有单实例的bean,因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有“第一次惩罚”的问题。

2.(博主摘抄自网络,并未接触过)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册

3.BeanFactory有实现类XmlBeanFactory,ApplicationContext有实现类ClassPathXmlApplicationContext(配置文件放置在类路径下),FileSystemXmlApplicationContext实现类

二者的共同点与联系:

1.二者都是接口,ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。


二.BeanFactory与FactoryBean

BeanFactory:以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂

FacotryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FacoryBean本身,如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。可以这么所,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式的工厂模式和修饰器模式类似。

为了便于理解,下面是我用java代码生成的工厂模式:

package factoryPattern;

public interface A {
	public void say();
}

public class B implements A {

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("说中国话");
	}

}

package factoryPattern;

public class C implements A {

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.print("speak english");
	}

}

package factoryPattern;

public class Factory {
	public static A create(int type){
		A a = null;
		if(type==1){
			a= new B();
		}else if(type==2){
			a= new C();
		}
		return a;
	}
}

package factoryPattern;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a=Factory.create(1);
		a.say();
		A b=Factory.create(2);
		b.say();
	}

}

输出:

说中国话
speak english


 


  



猜你喜欢

转载自blog.csdn.net/zhangchun888/article/details/50802984
今日推荐