先介绍一下Spring的IOC容器到底是个什么东西,都说是一个控制反转的容器,将对象的控制权交给IOC容器,其实在看了源代码之后,就会发现IOC容器只是一个存储单例的一个ConcurrentHashMap<String, BeanDefinition>

BeanDefinition只是一个将Object包装的对象,带有实例的其他属性,比如对应的Class等,而Spring默认创建的IOC容器为new DefaultListableBeanFactory(),可以看一下这个对象的属性

 /** Map from serialized id to factory instance. */private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =new ConcurrentHashMap<>(8);/** Optional id for this factory, for serialization purposes. */@Nullableprivate String serializationId;/** Whether to allow re-registration of a different definition with the same name. */private boolean allowBeanDefinitionOverriding = true;/** Whether to allow eager class loading even for lazy-init beans. */private boolean allowEagerClassLoading = true;/** Optional OrderComparator for dependency Lists and arrays. */@Nullableprivate Comparator<Object> dependencyComparator;/** Resolver to use for checking if a bean definition is an autowire candidate. */private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();/** Map from dependency type to corresponding autowired value. */private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);//这个Map就是专门储存实例的/** Map of bean definition objects, keyed by bean name. */private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);/** Map of singleton and non-singleton bean names, keyed by dependency type. */private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);/** Map of singleton-only bean names, keyed by dependency type. */private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);/** List of bean definition names, in registration order. */private volatile List<String> beanDefinitionNames = new ArrayList<>(256);/** List of names of manually registered singletons, in registration order. */private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);/** Cached array of bean definition names in case of frozen configuration. */@Nullableprivate volatile String[] frozenBeanDefinitionNames;/** Whether bean definition metadata may be cached for all beans. */private volatile boolean configurationFrozen = false;

而DefaultListableBeanFactory继承了BeanFactory的接口,并实现的这些方法。

BeanFactory

BeanFactory是Spring最核心的接口,也是Spring中最开始的地方,这个接口定义了一些常用的方法,也标明了常用方法的定义

public interface BeanFactory {/*** Used to dereference a {@link FactoryBean} instance and distinguish it from* beans <i>created</i> by the FactoryBean. For example, if the bean named* {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject}* will return the factory, not the instance returned by the factory.*/String FACTORY_BEAN_PREFIX = "&";//key值获取实例,也叫按bean的名称或ID获取对应的实例Object getBean(String name) throws BeansException;//按bean名称以及对应的class获取实例<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;//按class类型获取bean实例<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);//判断是否有对应的bean名称boolean containsBean(String name);//判断对应的bean名称是否为单例boolean isSingleton(String name) throws NoSuchBeanDefinitionException;//判断对应的bean名称是否为多例boolean isPrototype(String name) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;//按bean名称获取对应的class@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;String[] getAliases(String name);}

不过这里面有个常量FACTORY_BEAN_PREFIX这个跟FactoryBean有关。

FactoryBean

也是注入Bean实现的一种方法,先看一下这个接口:

public interface FactoryBean<T> {//获取对象@NullableT getObject() throws Exception;//获取对象对应的class@NullableClass<?> getObjectType();//是否为单例,默认为是default boolean isSingleton() {return true;}}

用法是实现这个接口,并且注入到Spring的IOC容器当中,示例:

@Component
public class SpringTest03FactoryBean implements FactoryBean<Fish> {public Fish getObject() throws Exception {return new Fish();}public Class<?> getObjectType() {return Fish.class;}public boolean isSingleton() {return true;}}

当时在从容器中取这个对应的bean名称的时候,确实返回getObject()中返回的对象,但是如果需要获取这个FactoryBean的对象的话,需在bean名称前面加个&,才能获取到对应的FactoryBean实现类的实例

这个看起来用的不多但是,在Mybatis和Spring的融合包中能够看到FactoryBean的身影,是专门将动态代理的dao接口注入到Spring的容器当中,这个后面再说

接下来看看在Spring源码中是在哪里处理了这个&符号

在Spring加载FactoryBean的时候,仅仅是将它当作一个普通的Bean注入

而在getBean的时候就会有区分

在AbstractBeanFactory的1658行,如果带有&则直接返回FactoryBean的实例

否则接着往下走

直接获取 factoryBeanObjectCache 对应的key值,没有话会先加载到factoryBeanObjectCache

这两种其实是两个不同的类,只是名字看着看不多而已

Spring中BeanFactory和FactoryBean的区别相关推荐

  1. Spring中 BeanFactory 与 FactoryBean 的区别

    作者:叁滴水 blog.csdn.net/qq_30285985/article/details/115433099 文章目录 前言 为什么会有FactoryBean? 通过源码深入学习Factory ...

  2. Spring源码分析-从源码看BeanFactory和FactoryBean的区别

    导语   在使用Spring 中最为核心的操作就是Bean的创建以及使用.下面就来带着大家一起来分析一下关于Spring的Bean的加载相关的知识 文章目录 BeanFactory getBean方法 ...

  3. Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  4. factorybean 声明_阿里面试题:BeanFactory与FactoryBean的区别

    作者:至尊宝 来源:cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的 ...

  5. 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?

    请说明一下Spring中BeanFactory和ApplicationContext的区别是什么? BeanFactory: 是spring中比较原始,比较古老的Factory.因为比较古老,所以Be ...

  6. spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别

    spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别 ApplicationContext ac = new Class ...

  7. spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?

    问题:spring中@Inject和@Autowired的区别?分别在什么条件下使用呢? 我在浏览SpringSource上的一些博客,在其他一个博客中,那个作者用了@Inject,但是我觉得他用@A ...

  8. Spring的BeanFactory和FactoryBean

    博客迁移了.麻烦去新地址查看. Spring的BeanFactory和FactoryBean 链接地址:http://www.msyy233.com/posts/17047.html#more

  9. [读书笔记]Spring中BeanFactory和ApplicationContext的联系和区别

    写在前言 依赖反转是指依赖对象的获得被反转了.依赖控制反转的实现有很多方式,Spring中IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对 ...

最新文章

  1. Prometheus 对比 Zabbix
  2. Android之ksoap2-android详解与调用天气预报Webservice完整实例
  3. docker mysql 无权限_Docker 中级篇
  4. 数列分块入门 8(LibreOj-6284)
  5. [翻译]Monocular Visual Odometry using OpenCV
  6. zebra 的Thread机制 -- 003
  7. labview由于其他对话正在访问FIFO_LabVIEW常用工具、调试工具汇总
  8. Linux三剑客--grep
  9. MAC安装Eclipse
  10. java万年历JFrame_Java Gui万年历
  11. 原生PHP配置paypal支付接口成功!不用Composer!
  12. 丢掉上半年全球新能源汽车销冠的特斯拉,烦恼不止比亚迪
  13. 条形码生成软件如何批量生成ISBN条码
  14. html onload div,将备用页面内容加载到div onload中
  15. 我的Python笔记02
  16. Jacob操作Word文档插入表格并表格中插入图片案例
  17. 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)
  18. 电脑内存条分几种,如何分辨呢?
  19. Python培训脱产班和周末班
  20. 用vue实现点击按钮,弹出一个视频,视频可拖动放大缩小

热门文章

  1. Eclipse 答疑:代码版权?如何更改 Eclipse 中注释块的 @author 版权信息?
  2. React使用antd Table生成层级多选组件
  3. 关闭浏览器前提示_win7系统ie总弹出查看和跟踪下载的关闭方法
  4. 编程入门python java和c语言_学习编程适不适合从Python入门?哪种语言更适合入门?...
  5. es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路
  6. win 10 java 安装_win10---Java安装及环境变量配置
  7. android insmod命令,android的启动脚本(init.rc)文件的语法
  8. 希望得到学术会议的及时回复该怎么说_张烨:在“选矿”博士的世界里,脚踏实地从来都不是说说而已!| 中南达人NO.188...
  9. 深度学习分类类别不平衡_「图像分类」 关于图像分类中类别不平衡那些事
  10. python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?