获取由spring管理的某个FactoryBean对象

当我们需要获取由spring管理的某个FactoryBean对象时可以在声明的bean的id值之前添加&符号
* 作为FactoryBean对象的key进行获取

package beans;

import org.springframework.beans.factory.FactoryBean;
/**
 * spring框架有这么一种规则
 * 假如由Spring管理的对象是工厂对象时,
 * 系统底层通常会提供一个工厂对应的bean对象
 * 这个bean对象要实现Spring中的一个接口FactoryBean
 *
 */
//实现接口要为泛型传值,这里为T传Object 定义接口的目的是定义规则
public class ObjectFactoryBean implements FactoryBean {

    /**
     * 通常在此方法中创建对应的对象
     * Spring底层在同个配置文件构建Bean对象时,
     * 首先会检测你这bean对象是否实现了FactoryBean接口
     * 假如实现了接口,spring会调用这个Bean对象的getObject()方法
     * 返回一个类的实例
     * @return
     * @throws Exception
     */
    @Override
    public Object getObject() throws Exception {
        System.out.println("ObjectFactoryBean.getObject()");
        return new ObjectFactory();//也可以通过反射
    }

    /**
     * 1.对象单例并且容器关闭时执行此方法
     * 2.底层通过这个方法销毁这个类型的对象
     * 单例对象spring即负责创建又负责销毁
     * 多例对象spring只负责创建不负责销毁
     */
    @Override
    public Class getObjectType() {
        System.out.println("ObjectFactoryBean.getObjectType()");
        return ObjectFactory.class;
        //假如对象是单例时,底层系统会在容器关闭时,依据此方法的返回类型,查找对象,并销毁对象
        
    }
/**
 * 通过此方法的返回值告诉底层系统此类的对象是否单例设计(此类的实例在内存中只有一份)
 * 此方法何时调用:对象创建时,单例对象销毁时
 */
    @Override
    public boolean isSingleton() {
        System.out.println("ObjectFactoryBean.isSingleton()");
        return true;
    }
    
}

 
 
package test;

import org.junit.Assert;
import org.junit.Test;

import beans.ObjectFactory;
import beans.ObjectFactoryBean;


public class TestBeans03 extends TestBase {
    @Test
    public void testObjectFactory(){
        ObjectFactory of=ctx.getBean("objectFactory",ObjectFactory.class);
        System.out.println(of.getClass().getName());
        System.out.println("测试结束");
        
    }
    @Test
    public void testObjectFactoryBean(){
        /**
         * 当我们需要获取由spring管理的某个FactoryBean对象时可以在声明的bean的id值之前添加&符号
         * 作为FactoryBean对象的key进行获取
         */
        ObjectFactoryBean ofb = ctx.getBean("&objectFactory",ObjectFactoryBean.class);
        System.out.println(ofb.getClass().getName());
        Assert.assertNotEquals(null, ofb);
    }
}

执行testObjectFactory

ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObject()
beans.ObjectFactory
测试结束

ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObjectType()

执行testObjectFactoryBean

beans.ObjectFactoryBean

ObjectFactoryBean.isSingleton()
ObjectFactoryBean.getObjectType()

你可能感兴趣的:(获取由spring管理的某个FactoryBean对象)