依赖查找安全性对比

依赖查找类型 代表实现 是否安全
单一类型 BeanFactory#getBean
ObjectFactory#getObject
ObjectProvider#getIfAvailable
集合类型 ListableBeanFactory#getBeansOfType
ObjectProvider#stream

实体类Rumenz.java

package com.rumenz;
public class Rumenz{private Integer id;private String name;@Overridepublic String toString() {return "Rumenz{" +"id=" + id +", name='" + name + '\'' +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

BeanFactory#getBean 单一类型查找

package com.rumenz;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class); //没有注册Rumenz.classac.refresh();//通过BeanFactory#getBeanbyBeanFactory(ac);ac.close();}private static void byBeanFactory(AnnotationConfigApplicationContext ac) {printBeanException("byBeanFactory",()->ac.getBean(Rumenz.class));}private static void printBeanException(String msg,  Runnable runnable) {System.err.println("from---->>>"+msg);try{runnable.run();}catch (Exception e){e.printStackTrace();}}}

输出

由于没有注册Rumenz.class,所以查找报错,不安全

from---->>>byBeanFactory
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rumenz.Rumenz' available

ObjectFactory#getObject 单一类型查找

package com.rumenz;import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class);ac.refresh();//通过ObjectFactory#getObjectbyObjectFactory(ac);ac.close();}private static void byObjectFactory(AnnotationConfigApplicationContext ac) {ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);printBeanException("byObjectFactory",()->beanProvider.getObject());}private static void printBeanException(String msg,  Runnable runnable) {System.err.println("from---->>>"+msg);try{runnable.run();}catch (Exception e){e.printStackTrace();}}
}

输出

由于没有注册Rumenz.class,所以查找报错,不安全

from---->>>byObjectFactory
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rumenz.Rumenz' available

ObjectProvider#getIfAvailable 单一类型查找

package com.rumenz;import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class);ac.refresh();//通过ObjectProvider#getIfAvailablebyObjectProvider(ac);ac.close();}private static void byObjectProvider(AnnotationConfigApplicationContext ac) {ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);printBeanException("byObjectProvider",()->beanProvider.getIfAvailable());}private static void printBeanException(String msg,  Runnable runnable) {System.err.println("from---->>>"+msg);try{runnable.run();}catch (Exception e){e.printStackTrace();}}}

输出

不存在Rumenz.class,也不会报错,安全

from---->>>byObjectProvider

ListableBeanFactory#getBeansOfType 集合查找

package com.rumenz;import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class);ac.refresh();// 通过ListableBeanFactory#getBeansOfType 集合类型查找byListableBeanFactory(ac);ac.close();}private static void byListableBeanFactory(AnnotationConfigApplicationContext ac) {printBeanException("byListableBeanFactory",()->ac.getBeansOfType(Rumenz.class));}private static void printBeanException(String msg,  Runnable runnable) {System.err.println("from---->>>"+msg);try{runnable.run();}catch (Exception e){e.printStackTrace();}}}

输出

不存在Rumenz.class,也不会报错,安全

from---->>>byListableBeanFactory

ObjectProvider#Stream 集合类型查找

package com.rumenz;import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class);ac.refresh();// 通过ObjectProvider#streambyObjectProviderStream(ac);ac.close();}private static void byObjectProviderStream(AnnotationConfigApplicationContext ac) {ObjectProvider<Rumenz> beanProvider = ac.getBeanProvider(Rumenz.class);printBeanException("byObjectProviderStream",()->beanProvider.stream().forEach(System.out::println));}private static void printBeanException(String msg,  Runnable runnable) {System.err.println("from---->>>"+msg);try{runnable.run();}catch (Exception e){e.printStackTrace();}}}

输出

不存在Rumenz.class,也不会报错,安全

from---->>>byObjectProviderStream

源码:https://github.com/mifunc/Spring-Safe-lookUp-Bean

原文: https://rumenz.com/rumenbiji/.html

Spring安全依赖查找相关推荐

  1. Spring 延迟依赖查找Bean

    Bean 延迟依赖查找接口 // 一个对象工厂 public interface ObjectFactory<T> {// 返回一个对象T getObject() throws Beans ...

  2. Spring 层次性依赖查找Bean

    层次性依赖查找接口 - HierarchicalBeanFactory 双亲 BeanFactory:getParentBeanFactory() 层次性查找 根据 Bean 名称查找 基于 cont ...

  3. 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)

    本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程.ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版 ...

  4. 万字博客带你全面剖析Spring的依赖注入

    1.写在前面 前面的博客我们已经写了Spring的依赖查找,这篇博客我们来了解写Spring的依赖注入. 2.依赖注入的模式和类型 手动模式 - 配置或者编程的方式, 提前安排注入规则 XML 资源配 ...

  5. Spring单一类型依赖查找Bean

    单一类型依赖查找接口 - BeanFactory BeanFacotry是spring中比较原始的Factory,BeanFactory是个Factory,也就是IOC容器或对象工厂 根据Bean名称 ...

  6. Spring高手之路——深入理解与实现IOC依赖查找与依赖注入

    本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例 2. IOC 的两种实现方式 2.1 依赖查找(Dependency Lookup) 2.2 依赖注入(Depe ...

  7. Spring依赖查找中的常见异常

    文章目录 BeansException的子接口 NoSuchBeanDefinitionException不存在要查找的Bean NoUniqueBeanDefinitionException 容器中 ...

  8. Spring集合类型依赖查找

    集合类型依赖查找接口 - ListableBeanFactory 根据 Bean 类型查找 获取同类型 Bean 名称列表 getBeanNamesForType(Class) getBeanName ...

  9. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入

    第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...

最新文章

  1. Jquery中bind和live的区别
  2. asp.net的一个不错日期控件
  3. mysql常用的分组函数
  4. 1、django安装,问题,创建项目,编写第一个demo
  5. cp文件服务器,docker容器与物理机的文件传输—docker cp命令
  6. android 自定义switch控件,Android中switch自定义样式
  7. Transformer组件很重要Attention is all you need
  8. Android RecyclerView封装下拉刷新与上拉加载更多
  9. CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
  10. 经典永流传,华为云媒体 AI 让老电影焕发新生
  11. 利用递归实现简单的树结构菜单
  12. JVM 调优一个月,性能提升了 400 倍!
  13. ArcGIS 道路线数据处理与拓扑操作
  14. NOD32离线升级更新包使用方法
  15. nginx学习:搭建静态资源服务器
  16. 安卓(Android)的原生系统真的那么好用吗
  17. 为什么你996猝死,老板007没事?
  18. 《富爸爸 穷爸爸》读书笔记--财商经典语录
  19. vlookup多条件的使用
  20. 网络推广能给企业公司带来什么好处?

热门文章

  1. Python3批量转换文本文件编码
  2. mysql执行计划缓存在哪_怎么去看懂mysql的执行计划
  3. 蓝桥杯 ALGO-20 算法训练 求先序排列 Java版
  4. 有道云 语法高亮_antlr语法增强使用
  5. 手机端主图在哪里设置_原来华为手机灭屏也能看时间,操作方法非常简单,1分钟学会...
  6. 以太坊搭建联盟链_区块链知识普及:什么是以太坊
  7. [GIT] warning: LF will be replaced by CRLF问题解决方法
  8. linux必备常用重要命令汇总
  9. awk 系列Part7:awk 怎么从标准输入(STDIN)读取输入
  10. 第二次作业(贪吃蛇)