依赖查找安全性比照
依赖查找类型 | 代表实现 | 是否平安 |
---|---|---|
繁多类型 | BeanFactory#getBean | 否 |
ObjectFactory#getObject | 否 | |
ObjectProvider#getIfAvailable | 是 | |
汇合类型 | ListableBeanFactory#getBeansOfType | 是 |
ObjectProvider#stream | 是 |
实体类Rumenz.java
package com.rumenz;public class Rumenz{ private Integer id; private String name; @Override public 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.class ac.refresh(); //通过BeanFactory#getBean byBeanFactory(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---->>>byBeanFactoryorg.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#getObject byObjectFactory(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---->>>byObjectFactoryorg.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#getIfAvailable byObjectProvider(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#stream byObjectProviderStream(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/Spr...
原文: https://rumenz.com/rumenbiji/.html