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核心编程思想。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据可视化01】matplotlib实例介绍2

目录 一、引言二、实例介绍1.箱线图2.热力图3.线条形式 一、引言 接着上一文章【数据可视化01】matplotlib实例介绍1继续介绍matplotlib的实例。 二、实例介绍 在matplotlib中&#xff0c;常用的图形类型包括&#xff1a; 箱线图&#xff08;Box plot&#xff09;&#xff1…

非预警,这3本TOP期刊,为何走到On Hold这步?

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

如何用时尚新姿讲好中国品牌故事?

品牌建设在推动高质量发展中扮演了双重角色&#xff0c;既是高质量发展的重要“承载者”&#xff0c;也是强有力的“助推器”。5月10日-11日&#xff0c;中国时尚品牌URBAN REVIVO&#xff08;以下简称UR&#xff09;以中国品牌日为起点&#xff0c;联合天猫超级品牌日&#xf…

Spring框架深度解析:打造你的Java应用梦工厂

想要在Java企业级应用开发中大展身手&#xff1f;Spring框架的核心容器是你不可或缺的伙伴&#xff01; 文章目录 一. 引言1.1 介绍Spring框架的重要性1.2 阐述核心容器在Spring框架中的作用1.3 故事开端 二. 背景介绍2.1 描述Spring框架的发展历程2.2 概述Spring框架的主要特点…

数学老师们

小学三年级之前的数学老师&#xff0c;包括学前班给过我零分的数学老师&#xff0c;模样、姓名都不记得了。能回忆起来的最早的数学老师是四、五年级的李成娥老师。 李老师四十岁左右&#xff0c;短发&#xff0c;温和、爱笑&#xff0c;尤其是在班主任张老师的衬托下&#xf…

有必要买超声波洗眼镜机吗?力荐四款实力超群超声波清洗机

在日常生活中&#xff0c;眼镜不仅仅是我们视野的延展&#xff0c;像太阳眼镜&#xff0c;也是有着独特的作用。但是&#xff0c;在每天的使用过程中&#xff0c;眼镜片表面难免会有灰尘&#xff0c;污迹&#xff0c;甚至油渍&#xff0c;这些都会对镜片的材质产生一定的损伤&a…

宝塔面板各种疑难杂症处理命令教程

下载地址&#xff1a;宝塔面板各种疑难杂症处理命令教程 这份宝塔面板各种疑难杂症处理命令教程&#xff0c;可以解决市面上遇到的各种难题&#xff0c;建议有技术能行的下载使用&#xff0c;小白也可以下载来学习可以帮助你解决宝塔面板遇到的各种难题

网络端口占用问题的综合调研与解决方案

原创 Randy 拍码场 问题背景 去年底信息安全团队进行网络权限治理&#xff0c;要求所有应用实例使用静态IP&#xff0c;公网访问策略与静态IP绑定&#xff1b;之后实例重启时偶现“端口被占用”错误。通过分析总结应用日志&#xff0c;共有以下4种错误类型&#xff0c;实质都是…

Apple store 静安·苹果店欣赏

官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕 静安苹果欣赏

LVGL移植到ARM开发板(GEC6818)

源码下载&#xff1a;点击跳转 下载好三个文件后&#xff0c;将其解压缩&#xff0c;并合到一个文件夹里面—— 1、修改 Makefile 删除 -Wshift-negative-value 2、修改 main.c 3、修改 lv_drv_conf.h 在lv_drv_conf.h文件屏幕驱动文件刚好与开发板LCD驱动文件一致&#xff0c…

【操作指南】银河麒麟高级服务器操作系统内核升级——基于4.19.90-17升级

1. 升级清单 升级包及依赖包清单如下。 kernel ARM架构 kernel-core-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-extra-4.19.90-23.18.v2101.ky10.aarch64.r…

【小笔记】neo4j用load csv指令导入数据

【小笔记】neo4j用load csv指令导入数据 背景 很久没有用load CSV的方式导入过数据了因为它每次导入有数量限制&#xff08;印象中是1K还是1W&#xff09;&#xff0c;在企业中构建的图谱往往都是大规模的&#xff0c;此时通常采用的是Neo4j-admin import方式。最近遇到了一些…

《二》菜单模块设计实现---添加动作函数等

在菜单栏中&#xff0c;比如&#xff1a; 我们要添加很多像新建&#xff0c;打开&#xff0c;粘贴&#xff0c;复制&#xff0c;加粗&#xff0c;下划线的动作&#xff0c;所以首先我们需要添加一些头文件&#xff1a; #include <QMainWindow> #include"mychild.h&…

麒麟信安连续四年被授予湖南省、长沙市“守合同重信用企业”双重荣誉称号

以诚为本&#xff0c;以信立身&#xff0c;**麒麟信安经过多年的市场积累&#xff0c;凭借健全的市场主体信誉机制&#xff0c;良好的社会信誉和合同履约能力&#xff0c;连续四年获评长沙市“守合同重信用”公示企业&#xff08;2023年度&#xff09;、湖南省“守合同重信用”…

OpenAI 或将推出多模态人工智能数字助理;研究发现部分 AI 系统已学会「说谎」丨 RTE 开发者日报 Vol.203

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

海洋环境保护论文阅读记录

海洋环境保护 论文1&#xff1a;Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的&#xff0c;港湾的 erodibility侵蚀度 sediment erodibility …

速了解及使用布隆过滤器

布隆过滤器 介绍 概念&#xff1a;是一种高效查询的数据结构 作用&#xff1a;判断某个元素是否在一个集合中。&#xff08;但是会出现误判的情况&#xff09; 实现原理 加入元素&#xff1a; 当一个元素需要加入到布隆过滤器中时&#xff0c;会使用一组哈希函数对该元素进…

自媒体从0-1起号全流程落地指南。(含工具)

下面开始进入主题&#xff1a; 一、持续涨粉的技巧 持续账号的账号通常是具备以下的几种特征 ①利他性&#xff1a;利他性的核心在于你向用户提供了什么&#xff1f; 可以透过逆向思维来体现&#xff0c;首先要明确目标人群及其需求&#xff0c;然后根据这些需求提供必要的…

JetsonNano —— 3、在Nano板卡编译可硬件加速FFmpeg,测试FFmpeg调用nvmpi编解码器加速

最终FFmpeg运行加速效果如下: FFmpeg 简介 一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。   JetsonNano 简介 NVIDIA Jetson Nano为数百万台高性能、低功耗设备提供前所未有的功能。这项技术创新为网络录像机、机器人或具有高级分析功能的智能家居网关等…

java 解决跨域时遇到问题,怎么来做一个跨域环境

今天遇到一个问题&#xff1a; 关于#java#的问题&#xff1a;java 解决跨域时遇到问题&#xff1a;为什么跨域访问时配置的CorsFilter没有进入&#xff1f;直接访问请求地址时进入了配置的CorsFilter 由于没有实际的跨域环境&#xff0c;因此打算在本机建一个跨域环境&#xff…