Spring(三)--SpringIOC的依赖查找

Spring依赖查找的根源

  • 在JavaBeans里有依赖查找,BeanContext。在JNDI也有依赖查找,Context类。

SpringIOC单一类型依赖查找接口

  • 根据Bean名称查找: getBean(String)
  • 根据Bean类型查找: 1. 实时查找(getBean(Class))。2.Spring 5.1 Bean延迟查找,getBeanProvider(Class)。

ObjectProvider是Spring提供的一种宽松注入方式,解决了强制依赖以及同类型多个bean的问题。

SpringIOC集合类型依赖查找-ListableBeanFactory

  • 获取同类型的Bean名称列表getBeanNameForType(Class),获取同类型Bean实例列表,getBeanOfType(Class)
  • 获取标注类型Bean名称列表,getBeanNamesForAnnotation(Class<? extends Annotation>),获取标注类型Bean实例列表getBeansWithAnnotation(Class<? extends Annotation>)
  • 指定名称+标注类型获取Bean实例, findAnnotationOnBean(String, Class<? extends Annotation>)

SpringIOC层次依赖查找-HierarchicalBeanFactory

SpringIOC有父容器的概念,下面介绍一些API

  • 获取父BeanFactory: getParentBeanFactory()
  • 层次查找: 1.根据Bean名称查找,containsLocalBean方法实现。2.根据Bean类型查找实例列表, 单一类型: BeanFactoryUtils#beanOfType,集合类型,BeanFactoryUtils#beansOfTypeIncludingAncestors.根据Java注解查找名称列表,BeanFactoryUtils#beanNamesForTypeIncludingAncestors。

SpringIOC的延迟查找

Bean延迟依赖查找接口

  • ObjectFactory
  • ObjectProvider,Spring5对JAVA8特性扩展,提供了函数式接口,Stream扩展。

SpringIOC安全依赖查找

安全指的找不到也不会抛异常
image.png

内建可查找的依赖

image.png

image.png
image.png

Spring依赖查找中经典异常

image.png

面试题

  • ObjectFactory与BeanFactory的区别

ObjectFactory与BeanFactory均提供依赖查找的能力,不过ObjectFactory仅关注一个或一种类型的Bean依赖查找,并且本身不具备依赖查找的能力,能力由BeanFactory输出,BeanFactory则提供单一类型,集合类型以及层次性等多种以来查找方式。ObjectFactory的经典实现ObjectFactoryCreatingFactoryBean就是底层由BeanFactory提供的支持。

  • BeanFactory.getBean操作是否线程安全

BeanFactory.getBean方法的执行是线程安全的,使用了synchronize关键字对definitionMap加锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Spring的IoC(Inversion of Control,控制反转)是一种设计模式,它通过将对象的创建和依赖关系的管理交给容器来实现。\[1\]依赖注入(Dependency Injection,DI)是Spring中实现IoC的一种方式,它通过将依赖关系注入到对象中,而不是由对象自己创建或查找依赖。\[2\]Spring提供了三种依赖注入的方式:构造器注入、setter注入和注解注入。构造器注入是通过构造方法来注入依赖,setter注入是通过setter方法来注入依赖,注解注入是通过使用注解(如@Autowired)来注入依赖。\[1\]总的来说,Spring实现IoC的方式是通过提供一个IoC容器来管理Bean,并通过依赖注入的机制来管理Bean之间的依赖关系。\[3\]这样可以实现对象之间的解耦和灵活性,使得代码更易于维护和测试。 #### 引用[.reference_title] - *1* [[Spring] IoC的理解及三种依赖注入方式](https://blog.csdn.net/weixin_43972154/article/details/124103561)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Spring IoC是如何进行依赖注入的](https://blog.csdn.net/yychuyu/article/details/107823395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值