Spring-依赖查找

news2024/10/5 13:03:27

依赖查找

根据名称进行查找

  • 实时查找
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.coloradmin.cn/o/1667472.html

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

相关文章

数据结构与算法===递归

文章目录 定义适用场景爬楼梯代码实现 小结 定义 递归(Recursion)是指函数的自身调用。 这个算法演变为了程序员之间的梗&#xff0c;所表达的意思近似于“套娃”&#xff0c;表示不断重复引用别人的话从而产生循环。 适用场景 这个应该很多的&#xff0c;像一些树的遍历&am…

谷歌最强AI——Gemini免费使用2个月教程,性能抗衡GPT4

谷歌最强AI——Gemini采用的是Ultra 1.0大模型&#xff0c;功能非常强大&#xff0c;媲美GPT-4&#xff01;谷歌用户只需要绑定虚拟卡&#xff0c;就可以免费使用2个月&#xff01; 谷歌昨夜官宣四项AI新进展&#xff01; 1、最大、功能最强的大模型版本Gemini Ultra 1.0全面…

【Arduino】ESP32/ESP8266 JSON格式解析

目录 1、JSON 2、JSON语法格式 基本概念&#xff1a; 语法规则&#xff1a; 数据类型&#xff1a; 示例&#xff1a; 3、JSON解析 单一对象JSON解析&#xff08;无嵌套&#xff09; JSON数组解析 使用ArduinoJson官网在线工具解析JSON信息 ESP8266闪存存储的JSON解析…

数据分析中大数据和云计算

大数据和云计算 前言一、大数据二、大数据定义三、数据存储单位四、大数据存储技术五、大数据应用技术六、大数据特征七、数据容量八、数据类型的多样性结构化数据半结构化数据非结构化数据 九、获取数据的速度十、可变性十一、真实性十二、复杂性十三、价值十四、云计算十五、…

模型推导:BG/NBD(预测用户生命周期(CLV)模型)

CLV&#xff08;Customer Lifetime Value&#xff09;指的是客户生命周期价值&#xff0c;用以衡量客户在一段时间内对企业有多大的价值。企业对每个用户的流失与否、在未来时间是否会再次购买&#xff0c;还会再购买多少次才会流失等问题感兴趣&#xff0c;本文中的BG/NBD模型…

【intro】Graph Isomorphism Network(GIN)

论文 https://arxiv.org/pdf/1810.00826 abstract 图神经网络(gnn)是一种有效的图表示学习框架。gnn采用邻域聚合方案&#xff0c;通过递归聚合和变换相邻节点的表示向量来计算节点的表示向量。已经提出了许多GNN变体&#xff0c;并在节点和图分类任务上取得了最先进的结果。…

C++实现一个简单的控制cpu利用率的程序

写一个程序&#xff0c;让控制cpu利用率在20%左右 思路很简单&#xff1a;每个循环控制sleep的时间占比 #include <iostream> #include <chrono> #include <unistd.h>int main() {int ratio 20;int base_time 1000;int sleeptime base_time * (100-ratio…

程序员必读书单(CSDN专享)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 今天是一篇分享资源的汇总&#xff0c;近半年来我总计分享了 202 本&#xff08;将近 10G &#xff09;的计算机领域著作…

web前端之纯CSS实现简单酷炫的照片墙效果、排除元素的伪类、scale

MENU 效果htmlstylescale:not() 效果 html <div class"container"><div class"box"><img src"../../image/1_.jpg"></div><div class"box"><img src"../../image/2_.jpg"></div>…

欢乐钓鱼大师攻略,怎么获取道具?

在《欢乐钓鱼大师》的游戏世界中&#xff0c;道具是提升钓鱼体验、解锁新功能以及完成挑战的关键。通过多种方式获取道具&#xff0c;能够帮助玩家更好地探索游戏世界、挑战自我&#xff0c;以及与其他玩家展开竞争。以下是关于如何获取道具的详细攻略&#xff0c;让你能够在游…

嵌入式全栈开发学习笔记---C语言笔试复习大全16

目录 指针和数组 用指针来表示数组 用数组来表示指针 笔试题19 上一篇复习了指针使用时的相关注意事项&#xff0c;这一篇我们开始复习指针和数组。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff0c;网上关于C语言的资料有很多&#xff0c;大家如果对…

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后&#xff0c;实时监控视频后台播放一段时间后&#xff0c;报错如下&#xff1a; The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下&#xff0c;直接用代码运行系统&#xff0c;视频在…

XP316,XP351中控DCS模块

XP316,XP351中控DCS模块。在设计分布式系统时&#xff0c;需要考虑以下原则可靠性&#xff1a;系统应该能够在节点故障的情况下继续工作&#xff0c;同时保证数据的一致性和可靠性。XP316,XP351中控DCS模块&#xff08;2&#xff09;可扩展性&#xff1a;保证用户的响应时间。安…

Tableau学习2.0版——复习

官网下载链接&#xff1a;https://www.tableau.com/zh-cn/support/releases 学生账户申请链接&#xff1a;https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析&#xff08;比…

自动化机器学习——神经网络架构搜索

自动化机器学习——神经网络架构搜索 随着深度学习在各领域的广泛应用&#xff0c;设计高效的神经网络架构变得至关重要。传统的神经网络架构设计通常依赖于人工经验和试错&#xff0c;这种方式往往效率低下且不保证找到最优解。因此&#xff0c;自动化机器学习中的神经网络架…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

sqli-labs 第八关盲注python脚本

目录 ​编辑 判断库名 1.库名长度 2.库名 import requests import mathurl "http://127.0.0.1/Less-8"def dblength():for i in range(20):payload f"1 and length(database())>{i}-- "data {id: payload}res requests.get(url, paramsdata)if …

异常检测的学习和实战

1.应用&#xff1a; 1.在工业上的应用 当检测设备是否处于异常工作状态时&#xff0c;可以由上图分析得到&#xff1a;那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的&#xff0c;所以数据点应该比较密集地集中在一个范围内&#xff0c;而那些明…

Attention-guided Feature Distillation for Semantic Segmentation

摘要 与现有的复杂方法相比&#xff0c;该方法通常用于从老师那里提取知识给学生&#xff0c;该方法展示了一种简单而强大的方法&#xff0c;可以利用精细的特征映射来转移注意力。事实证明&#xff0c;该方法在提取丰富信息方面是有效的&#xff0c;在作为密集预测任务的语义…

Obsidian/Typora设置图床

在obsidian中默认图片是保存在本地的&#xff0c;但是在要导出文档上传到网上时&#xff0c;由于图片保存在本地&#xff0c;会出现无法加载图片的问题。 这里引用的一段话&#xff1a; 这里使用picgo-core和gitee实现图床功能&#xff0c; 参考1&#xff1a; Ubuntu下PicGO配…