您的位置:首页 > 编程语言 > Java开发

Spring框架学习(四)

2016-03-05 19:02 537 查看
本篇主要对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: