Spring源码之BeanFactory,IOC是是由BeanFactory的核心子类实现的

一,让我们了解IOC的概念

所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

二,了解什么是BeanFactory

BeanFactory是Spring中最重要的接口之一在我们学习Spring开发xml文件的方式中我们用的getBean()就是由他提供的。知道一说的是在这个接口中比较常用到的方法也只有这个getBean()方法,那为什么还说它是Spring最重要的接口呢?因为它的实现子类DefaultListableBeanFactory

实现了IOC也就是控制反转和依赖注入

ClassPathXmlApplicationContext中获取Bean

        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        context.getBean(F1.class);

BeanFactory源码一观,里面只有getBean()方法是最重要的

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

IOC也就是控制反转就是把对象创建交给IOC容器,这里也可以说是Spring容器。后缀由带上Context的通常来说都是容器比如ClassPathXmlApplicationContext,

AnnotationConfigApplicationContext等等都是容器。然而我们要把类放进容器中就出现了问题。我们应该怎么把类放到也就是注册到容器中呢?这里就要用到BeanFactory实现子类DefaultListableBeanFactory来完成

三,什么是DefaultListableBeanFactory呢?

类图

 由上面的类图我们可以看见DefaultListableBeanFactory间接和直接继承了很多类其中BeanDefinitionRegistry提供了注册方法。

接下去让我们看看是如何把类注册到容器中的。很多容器都继承了DefaultListableBeanFactory所以才有注册Bean的功能,所以我们这边直接演示DefaultListableBeanFactory注册过程

四,DefaultListableBeanFactory注册Bean

简单注册不指定任何属性BeanDefinition

        DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
        beanFactory.registerSingleton("f1", WebConfig.class);

注册且指定BeanDefinition

        DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
        //指定作用域
        AbstractBeanDefinition webConfig = BeanDefinitionBuilder.genericBeanDefinition(WebConfig.class).setScope("singleton").getBeanDefinition();
        //注册
        beanFactory.registerBeanDefinition("webConfig",webConfig);

总结

所以说BeanFactory是Spring做重要的接口,控制反转和依赖注入都是它的实现子类DefaultListableBeanFactory完成的

可以观看另一篇文章了解更多注册以及BeanDefinition

Spring源码系类之Bean的理解以及Bean注册,你真的了解Bean吗?

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值