spring-ioc中 Factorybean 和 Beanfactory的区别

        FactoryBean和BeanFactory都是spring中的接口,从名字上看大家一定觉得这两个东西有某些联系,但是其实这个两个接口除了名字像之外真的没啥关系

(1)BeanFactory

          这个接口是spring IOC容器最顶层的接口,大家可以看一下类图

这个接口提供了最基本的容器方法,其他的容器类都是继承这个接口来拓展相应的功能的,感兴趣的同学可以去看看

(2)FactoryBean

        这个接口是spring提供的用于装饰用户bean的接口,这里采用了装饰器模式,没有研究过的同学可以看我的另一篇博文:https://my.oschina.net/u/1169535/blog/757276

        举个例子

        实体类:

        

public class C {

    private String attr;


    public String getAttr() {
        return attr;
    }

    public void setAttr(String attr) {
        this.attr = attr;
    }
}

spring xml配置文件

<bean name="c" class="com.chameleon.dao.daoImpl.C">
   <property name="attr" value="ceshi"/>
</bean>

测试类

public class MainClient {
    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/spring/chameleon-context.xml");
        C c =  (C)beanFactory.getBean("c");
        System.out.println(c.getAttr());
    }
}

结果:ceshi

这就是一个spring依赖注入的简单的不能再简单的例子

那现在我有一个想法,就是在获取这个C的实例的时候通知一下标记一下,或者计数也好,怎么办呢?这个时候就可以使用factorybean装饰一下了,只需要改一下实体类

public class C implements FactoryBean {
    private String attr;
    
    public String getAttr() {
        return attr;
    }

    public void setAttr(String attr) {
        this.attr = attr;
    }

    public Object getObject() throws Exception {
        System.out.println("装饰一下");
        C c = new C();
        c.setAttr(attr);
        return c;
    }

    public Class<?> getObjectType() {
        return C.class;
    }

    public boolean isSingleton() {
        return true;
    }
}

在运行一下测试方式

结果为:

装饰一下
ceshi

        具体的实现就是spring在进行依赖注入的时候会判断当前的bean 是不是 instanceOf factoryBean  如果属于的话 会执行getObject方法返回对象实例,具体的细节感兴趣的同学可以看相应的代码

        

猜你喜欢

转载自my.oschina.net/u/1169535/blog/889911