Spring-依赖查找

依赖查找

根据名称进行查找

  • 实时查找
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");
Object bean = beanFactory.getBean("personHolder");
System.out.println(bean);

xml如下:

<bean id="person"  class="pojo.Person"><property name="name" value="yong"></property><property name="id" value="1001"></property>
</bean>
<bean id="personHolder"  class="pojo.PersonHolder" ><property name="city" value="BEIJING"></property><property name="person" ref="person"></property>
</bean>
  • 延迟查找
    所谓延迟查找其实就是我们使用到这个Bean的时候再去进行查找。
    通过xml配置的方式:
<!-- 这里指定了查找方式为延迟查找也就是说在需要用到这个bean的时候才会初始化 -->
<bean id="personHolder"  class="pojo.PersonHolder" lazy-init="true" init-method="init"><property name="city" value="BEIJING"></property><property name="person" ref="person"></property>
</bean>

通过注解的方式:

@Bean
@Lazy
PersonHolder personHolder(Person person) {return new PersonHolder(person);
}

通过ObjectProvider的方式:

/**
* 也是延迟加载
* @param applicationContext
*/
private static void lookupIfAvailable(AnnotationConfigApplicationContext applicationContext) {ObjectProvider<PersonHolder> userObjectProvider = applicationContext.getBeanProvider(PersonHolder.class);PersonHolder personHolder = userObjectProvider.getIfAvailable(PersonHolder::createPersonHolder);System.out.println("当前 User 对象:" + personHolder);
}
public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(LookUpLazyByNameAnnotation.class);context.refresh();lookupIfAvailable(context);
}

除了getIfAvailable, ObjectProvider还提供了getIfUnique方法。

根据类型查找
  • 单个Bean
/*** 通过类型查找* @param beanFactory*/
public static void lookUpByType(BeanFactory beanFactory) {Client bean = beanFactory.getBean(Client.class);System.out.println(bean);
}
  • 集合类型的查找
/*** 集合查找 ListableBeanFactory 实现了这个接口就可以进行集合查找* @param beanFactory*/
public static void lookUpCollectionByType(BeanFactory beanFactory) {if (beanFactory instanceof ListableBeanFactory) {ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;Map<String, Client> beansOfType = listableBeanFactory.getBeansOfType(Client.class);System.out.println(beansOfType);}
}

根据注解查找

  • 集合查找
/**
* 集合查找
* @param beanFactory
*/
public static void lookUpCollectionByAnnotation(BeanFactory beanFactory) {if (beanFactory instanceof ListableBeanFactory) {ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class);System.out.println(beansOfType);}
}

依赖查找详细版本

  • 单一类型依赖查找(主要是基于BeanFactory)
    根据Bean名称查找

  • getBean(String)

  • Spring 2.5 覆盖默认参数:getBean(String, Object)
    根据Bean类型查找
    Bean实时查找
    - Spirng 3.0getBean(Class)
    - Spring 4.1覆盖默认参数:getBean(Class, Object)
    Spring 5.1 Bean 延迟查找
    - getBeanProvider(Class)
    - getBeanProvider(ResolvableType)
    根据名称 + 类型查找 : getBean(Class, Name)
    JNDI - javax.naming.Context#lookup(javax.naming.Name)
    JavaBeans-java.beans.beancontext.BeanContext
    在这里插入图片描述

  • 集合类型依赖查找(Listable BeanFactory)

  • 根据 Bean 类型查找

    • 获取同类型 Bean 名称列表
      • getBeanNamesForType(Class)
      • Spring 4.2 getBeanNamesForType(ResolvableType)
    • 获取同类型 Bean 实例列表
      • getBeansOfType(Class)以及重载方法
  • 通过注解类型查找
    Spring 3.0 获取标注类型 Bean 名称列表

    • getBeanNamesForAnnotation(Class<? extends Annotation>
  • Spring 3.0 获取标注类型 Bean 实例列表

    • getBeansWithAnnotation(Class<? extends Annotation>)
  • Spring 3.0 获取指定名称+标注类型 Bean 实例

    • findAnnotationOnBean(String, Class<? extends Annotation>)
  • 层次性依赖查找接口-HierarchicalBeanFactory
    双亲 BeanFactory:getParentBeanFactory()
    层次性查找
    根据 Bean 名称查找
    基于 containsLocalBean 方法实现
    根据 Bean 类型查找实例列表
    单一类型:BeanFactoryUtils#beanOfType
    集合类型:BeanFactoryUtils#beansOfTypelncludingAncestors
    根据 Java 注解查找名称列表
    BeanFactoryUtils#beanNamesForTypelncludingAncestors

public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext context  = new AnnotationConfigApplicationContext();context.register(Client.class);ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();// 创建父亲工厂BeanFactory parent = createParent();// 设置父亲工厂beanFactory.setParentBeanFactory(parent);// 获取父工厂HierarchicalBeanFactory parentBeanFactory = (HierarchicalBeanFactory) beanFactory.getParentBeanFactory();// 父亲工厂查询disPlayLocalBean(parentBeanFactory, "user");// 当前工厂查询disPlayLocalBean(beanFactory, "user");// 双亲委派 当前工厂查不到 查父亲工厂displayContainsBean(beanFactory, "user");context.refresh();context.close();}public static BeanFactory createParent() {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);reader.loadBeanDefinitions("beans.xml");return beanFactory;}public static void displayContainsBean(HierarchicalBeanFactory beanFactory  , String beanName) {boolean containsBean = containsBean(beanFactory, beanName);System.out.printf("当前工厂是否包含 %s",containsBean);}public static boolean containsBean(HierarchicalBeanFactory beanFactory, String beanName) {BeanFactory parent = beanFactory.getParentBeanFactory();if (parent instanceof HierarchicalBeanFactory) {HierarchicalBeanFactory parentHierarchicalBeanFactory = HierarchicalBeanFactory.class.cast(parent);if (containsBean(parentHierarchicalBeanFactory, beanName)) {return true;};}return beanFactory.containsBean(beanName);}public static void disPlayLocalBean(HierarchicalBeanFactory beanFactory, String beanName) {System.out.printf("当前工厂是否包含 %s", beanFactory.containsLocalBean(beanName));System.out.println();}
}
  • 延迟查找
    主要涉及 ObjectFactory 和 ObjectProvider
public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext context  = new AnnotationConfigApplicationContext();context.register(Client.class);context.refresh();lookupIfAvailable(context);context.close();}public static void lookupIfAvailable(ApplicationContext context) {ObjectProvider<User> beanProvider = context.getBeanProvider(User.class);User user = beanProvider.getIfAvailable(() -> User.createUser());System.out.println(user);}
}
  • 安全查找
    在这里插入图片描述
    也就是说单一查前两个会抛出异常,所以不安全,其它的方法获取Bean获取不到也不会抛出异常。
public class Client {public static void main(String[] args) {AnnotationConfigApplicationContext context  = new AnnotationConfigApplicationContext();context.register(Client.class);context.refresh();displayBeanFactoryGetBean(context);}/*** 会发生异常* @param beanFactory*/public static void displayBeanFactoryGetBean(BeanFactory beanFactory) {try {beanFactory.getBean(User.class);} catch (Exception e) {e.printStackTrace();}}
}
  • 内部依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 依赖查找中的异常
    在这里插入图片描述
    参考资料:Spring核心编程思想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维自动化工具:Ansible 概念与模块详解

目录 前言 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 5、Ansible 的优缺点 三、Ansible 安装部署 1、环境部署 2、管理节点安装 Ansible 3、…

Golang | Leetcode Golang题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; func sortColors(nums []int) {p0, p2 : 0, len(nums)-1for i : 0; i < p2; i {for ; i < p2 && nums[i] 2; p2-- {nums[i], nums[p2] nums[p2], nums[i]}if nums[i] 0 {nums[i], nums[p0] nums[p0], nums[i]p0}} }

模型全参数训练和LoRA微调所需显存的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

k8s调度原理以及自定义调度器

kube-scheduler 是 kubernetes 的核心组件之一&#xff0c;主要负责整个集群资源的调度功能&#xff0c;根据特定的调度算法和策略&#xff0c;将 Pod 调度到最优的工作节点上面去&#xff0c;从而更加合理、更加充分的利用集群的资源&#xff0c;这也是我们选择使用 kubernete…

java--io流(一)

1. 前置知识 字符集是什么&#xff1f; 字符集&#xff08;Character Set&#xff09;是一组字符的集合&#xff0c;它定义了可以在计算机系统中使用的所有字符。字符集可以包括字母、数字、标点符号、控制字符、图形符号等。字符集使得计算机能够存储、处理和显示各种语言和…

嵌入式Linux学习第四天启动方式学习

嵌入式Linux学习第四天 今天学习I.MX6U 启动方式详解。I.MX6U有多种启动方式&#xff0c;可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。 启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后&#xff0c;芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_M…

Linux——基础IO2

引入 之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件 那些未被打开的文件呢&#xff1f; 大部分的文件都是没有被打开的文件&#xff0c;这些文件在哪保存&#xff1f;磁盘(SSD) OS要不要管理磁盘上的文件&#xff1f;(如何让OS快速定位一个文件) 要…

数据仓库与数据挖掘实验练习3-4(实验二2024.5.8)

练习3 1.简单文件操作练习 import pandas as pd # 读取文件 pd.read_csv(pokemon.csv) # 读取 CSV 文件的函数调用&#xff0c;它将文件中的数据加载到 DataFrame 中&#xff0c;并指定了 Pokemon 列作为索引列。 pd.read_csv(pokemon.csv,index_colPokemon)#查看类型 type(p…

React:Router-2. createBrowserRouter函数式

参考文档&#xff1a;ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式&#xff0c;在react-router6.4.0及以上版本&#xff0c;提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件&#xff0c;使用createBrow…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题&#xff08;难度系数 5&#xff0c;35 个计分点&#xff09; 提示信息&#xff1a; 平均数&#xff1a;是指在一组数据中所有数据之和再除以这组数据的个数。 如&#xff1a;“1&#xff0c;2&#xff0c;3&#xf…

命令行方式将mysql数据库迁移到达梦数据库(全步骤)

因项目需求&#xff0c;需要将mysql数据库转换为国产达梦数据库&#xff0c;但由于安全问题&#xff0c;正式环境只能用命令行方式连接&#xff0c;下列是操作全步骤 目录 一、操作逻辑二、操作步骤1、本地安装达梦相关工具2、将服务器mysql导出到本地a) 服务器命令行导出mysql…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

音频录制软件有哪些?这2种推荐给你

音频在当今数字化世界中扮演着至关重要的角色。无论是音乐创作、语音记录、会议记录还是其他任何需要捕捉声音的场景&#xff0c;音频录制软件都是能为我们提供强大功能的工具。 那么到底哪一种软件才最适合您呢&#xff1f;下面小编将为您介绍2款音频录制软件。 方法一&#…

Ansys Mechanical|绳索仿真技术

绳索&#xff0c;俗称绳子&#xff0c;是通过扭或编等方式加强后&#xff0c;连成一定长度的纤维。其拉伸强度很好但没有压缩强度&#xff0c;可用来做连接、牵引的工具。绳索的用途数不胜数&#xff1a;从建筑中的材料固定、到岩土工程中的柔性锚索、汽车门窗的升降拉索、电缆…

在系统学习C语言之前所需要了解的知识

C语言常见概念 前言1. C语言是什么2. C语言的历史和辉煌3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点优点&#xff1a;缺点&#xff1a; 4. VS项目和源文件、头文件介绍5. 第⼀个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII…

Spring Cloud Kubernetes 本地开发环境调试

一、Spring Cloud Kubernetes 本地开发环境调试 上面文章使用 Spring Cloud Kubernetes 在 k8s 环境中实现了服务注册发现、服务动态配置&#xff0c;但是需要放在 k8s 环境中才能正常使用&#xff0c;在本地开发环境中可能没有 k8s 环境&#xff0c;如何本地开发调试呢&#…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

探索MySQL数学宝库:常用数学函数的秘密操作

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探索MySQL数学宝库&#xff1a;常用数学函数的秘密操作 前言ABS函数&#xff08;绝对值&#xff09;ROUND函数&#xff08;四舍五入&#xff09;CEIL和FLOOR函数&#xff08;向上取整和向下取整&#…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代&#xff0c;个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI&#xff0c;为消费者提供了精彩的内容推荐服务&#xff0c;更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好&#xff0c;能够快速识别其兴趣…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…