Spring IoC

Spring IoC 接口设计图


三条主要设计路线:

1. BeanFactory -> HierarchicalBeanFactory -> ConfigarableBeanFactory  (单词 hierarchical: 分层的)
    BeanFactory: 定义了基本的IoC规范, 如:getBean()

    HierarchicalBeanFactory: 增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IoC容器的管理功能

    ConfigurableBeanFactory: 定义了一些对BeanFactory的配置功能,比如通过SetParentBeanFactory()设置双亲IoC容器

     通过addBeanPostProcessor()配置Bean后置处理器等

2. 以ApplicationContext为核心的接口设计. 

  这里涉及到BeanFactory -> ListableBeanFactory -> ApplicationContext -> WebApplicationContext 或者 ConfigurableApplictionContext

      其中ListableBeanFactory 连接BeanFactory, 细化了BeanFactory的接口功能, 比如定义了getBeanDefinitionNames()

      ApplicationContext: 通过集成MessageSource,ResuourceLoadder,ApplicationEventPublisher接口, 在BeanFactory简单IoC容器的基础上,添加了许多对高级容器特性的支持.

BeanFactory 应用场景

    BeanFactory提供 最基本IoC容器的功能, IoC容器所应遵守的最底层和最基本的编程规范

    在用户使用容器时,可以通过转义符&来得到FactoryBean本身

FactoryBean与BeanFactory:
一个是Factory,也就是IoC容器或对象工厂
一个是Bean,
在Spring中,所有的Bean都是有BeanFactory(也就是IoC容器来管理的)
但对于FactoryBean而言,这个Bean不是简单的Bean,而是一个能产生或修饰对象生成工厂的Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

看一段代码

public class ProxyDBObject implements FactoryBean<Object> { //实现了FactoryBean接口
    private String currentDB;

    @Override
    public Object getObject() {
        if("mysql".equals(currentDB)){
            return new MysqlDB();
        }
        return new OracleDB();
    }

    @Override
    public Class<?> getObjectType() {
        if("mysql".equals(currentDB)){
            return MysqlDB.class;
        }
        return OracleDB.class;
    }

    public String getCurrentDB() {
        return currentDB;
    }

    public void setCurrentDB(String currentDB) {
        this.currentDB = currentDB;
    }
}

Spring配置文件

<bean id="proxyDBObject" class="com.chenhe.factorybean.ProxyDBObject">
        <property name="currentDB" value="mysql"/>
    </bean>

测试类

//proxyDBObject并不是ProxyDBObject,而是它getObject()方法返回的Bean
Object proxyDBObject = context.getBean("proxyDBObject");
//通过&符号,才能获取到ProxyDBObject类型的Bean
proxyDBObject = context.getBean("&proxyDBObject");
凡是实现了FactoryBean接口的类,都不能直接通过applocationContext.get(beanName)的方式直接获取该Bean,要通过加上&才能获取该Bean, 否则获取的永远都是getObject()返回的Bean



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值