BeanFactory与FactoryBean2

BeanFactory为一个管理bean的工厂(即为spring的容器),它管理的对象可以是bean也可以是FactoryBean(这种请况会再调用FactoryBeangetObject()获取真正的bean)

FactoryBean为一个工厂bean,受BeanFactory管理,同时它也管理着一个bean

 

接着来看一看FactoryBean

public interface FactoryBean {

    Object getObject() throws Exception;

    Class getObjectType();

    boolean isSingleton();

}

FactoryBeanspring的一个工厂bean,他可以管理一个bean,通过isSingleton方法设置此bean是否为单例,通过getObject方法获取此bean实例的引用,getObjectType

方法获取此bean的类型。记住一点:FactoryBean在配置文件中的定义和普通bean没有区别,但是当客户端对beanId进行请求时,返回的是它管理的bean实例引用(即此FactoryBean通过getObject获取了它所管理的bean实例引用)。

 

下面举一个例子来说明:

Fengshan1.java(此类为被FactoryBean管理的类):

public class FengShan1 {

    public void descrip(){

       System.out.println("凤山是个美丽的小县城!");

    }

}

 

TianE.java(此类为继承FactoryBean接口的类)

public class TianE implements FactoryBean {

    public Object getObject() throws Exception {

       return new FengShan1();

    }

    public Class getObjectType() {

       return FengShan1.class;

    }

    public boolean isSingleton() {

       return true;

    }

}

 

Beam.xml(spring配置文件):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans default-autowire="byName" >

<!—FactoryBean配置-->

     <bean id="tiane" class="com.dvnchina.test.TianE"  />

</beans>

 

Test.java(测试类)

public class Test extends TestCase {

    public void test(){

       ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

       FengShan1 fengShan1 = (FengShan1) ctx.getBean("tiane");

       fengShan1.descrip();

       FengShan1 fengShan2 = (FengShan1) ctx.getBean("tiane");

       System.out.println(fengShan1==fengShan2);

    }

}

 

结果:

凤山是个美丽的小县城!

true

 

在测试类中,ctx.getBean("tiane")获取的是FactoryBeanBeanId,但返回的是它所管理的Bean实例(FengShan1)。另外,因为在FactoryBeanisSingleton方法返回值为true,因此fengShan1fengShan2将指向同一个引用。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章