Spring安全依赖查找
依赖查找安全性对比
依赖查找类型 | 代表实现 | 是否安全 |
---|---|---|
单一类型 | 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安全依赖查找相关推荐
- Spring 延迟依赖查找Bean
Bean 延迟依赖查找接口 // 一个对象工厂 public interface ObjectFactory<T> {// 返回一个对象T getObject() throws Beans ...
- Spring 层次性依赖查找Bean
层次性依赖查找接口 - HierarchicalBeanFactory 双亲 BeanFactory:getParentBeanFactory() 层次性查找 根据 Bean 名称查找 基于 cont ...
- 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程.ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版 ...
- 万字博客带你全面剖析Spring的依赖注入
1.写在前面 前面的博客我们已经写了Spring的依赖查找,这篇博客我们来了解写Spring的依赖注入. 2.依赖注入的模式和类型 手动模式 - 配置或者编程的方式, 提前安排注入规则 XML 资源配 ...
- Spring单一类型依赖查找Bean
单一类型依赖查找接口 - BeanFactory BeanFacotry是spring中比较原始的Factory,BeanFactory是个Factory,也就是IOC容器或对象工厂 根据Bean名称 ...
- Spring高手之路——深入理解与实现IOC依赖查找与依赖注入
本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例 2. IOC 的两种实现方式 2.1 依赖查找(Dependency Lookup) 2.2 依赖注入(Depe ...
- Spring依赖查找中的常见异常
文章目录 BeansException的子接口 NoSuchBeanDefinitionException不存在要查找的Bean NoUniqueBeanDefinitionException 容器中 ...
- Spring集合类型依赖查找
集合类型依赖查找接口 - ListableBeanFactory 根据 Bean 类型查找 获取同类型 Bean 名称列表 getBeanNamesForType(Class) getBeanName ...
- factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入
第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...
最新文章
- Jquery中bind和live的区别
- asp.net的一个不错日期控件
- mysql常用的分组函数
- 1、django安装,问题,创建项目,编写第一个demo
- cp文件服务器,docker容器与物理机的文件传输—docker cp命令
- android 自定义switch控件,Android中switch自定义样式
- Transformer组件很重要Attention is all you need
- Android RecyclerView封装下拉刷新与上拉加载更多
- CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
- 经典永流传,华为云媒体 AI 让老电影焕发新生
- 利用递归实现简单的树结构菜单
- JVM 调优一个月,性能提升了 400 倍!
- ArcGIS 道路线数据处理与拓扑操作
- NOD32离线升级更新包使用方法
- nginx学习:搭建静态资源服务器
- 安卓(Android)的原生系统真的那么好用吗
- 为什么你996猝死,老板007没事?
- 《富爸爸 穷爸爸》读书笔记--财商经典语录
- vlookup多条件的使用
- 网络推广能给企业公司带来什么好处?
热门文章
- Python3批量转换文本文件编码
- mysql执行计划缓存在哪_怎么去看懂mysql的执行计划
- 蓝桥杯 ALGO-20 算法训练 求先序排列 Java版
- 有道云 语法高亮_antlr语法增强使用
- 手机端主图在哪里设置_原来华为手机灭屏也能看时间,操作方法非常简单,1分钟学会...
- 以太坊搭建联盟链_区块链知识普及:什么是以太坊
- [GIT] warning: LF will be replaced by CRLF问题解决方法
- linux必备常用重要命令汇总
- awk 系列Part7:awk 怎么从标准输入(STDIN)读取输入
- 第二次作业(贪吃蛇)