延遲依賴查找
Bean延遲依賴查找接口
- org.springframework.beans.factory.ObjectFactory
- org.springframework.beans.factory.ObjectProvider
- Spring 5對java 8特性擴展
- 函數(shù)式接口
- getIfAvailiable(Supplier)
- IfAvaliable(Consumer)
- Stream擴展-Stream()
依賴查找安全性對比
截屏2022-09-15 15.00.13.png
注意:層次性依賴查找的安全性取決于其擴展的單一或集合類型的BeanFactory接口
內(nèi)建可查找的依賴
- 函數(shù)式接口
- Spring 5對java 8特性擴展
- AbstractApplicationContext內(nèi)建可查找的依賴
截屏2022-09-15 16.29.53.png
注解驅(qū)動Spring應(yīng)用上下文內(nèi)建可查找的依賴(部分)
截屏2022-09-15 16.39.18.png
截屏2022-09-15 21.58.14.png
依賴查找中的經(jīng)典異常 -
BeansException子類型
截屏2022-09-16 10.11.46.png
public class NoUniqueBeanDefinitionExceptionDemo {
public static void main(String[] args) {
//創(chuàng)建BeanFactory容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//ObjectProviderDemo Class(配置類)
applicationContext.register(NoUniqueBeanDefinitionExceptionDemo.class);
//啟動spring應(yīng)用上下文
applicationContext.refresh();
try {
applicationContext.getBean(String.class);
} catch (NoUniqueBeanDefinitionException e){
System.err.printf("Spring 應(yīng)用上下文存在 %d 個 s% 類型的 Bean ,具體原因:%s%n",
e.getNumberOfBeansFound(),
String.class.getName(),
e.getMessage());
}
//顯示的關(guān)閉spring應(yīng)用上下文
applicationContext.close();
}
@Bean
public String bean1(){
return "bean1";
}
@Bean
public String bean2(){
return "bean2";
}
}
public class BeanInstanationExceptionDemo {
public static void main(String[] args) {
//創(chuàng)建BeanFactory容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//注冊BeanDefinition Bean Class 是一個 CharSequence 接口
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(CharSequence.class);
applicationContext.registerBeanDefinition("errorBean",beanDefinitionBuilder.getBeanDefinition());
//啟動spring應(yīng)用上下文
applicationContext.refresh();
//顯示的關(guān)閉spring應(yīng)用上下文
applicationContext.close();
}
}
public class BeanCreationExceptionDemo {
public static void main(String[] args) {
//創(chuàng)建BeanFactory容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//注冊BeanDefinition Bean Class 是一個 POJO 普通類 ,不過初始化方法回調(diào)時拋出異常
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(POJO.class);
applicationContext.registerBeanDefinition("errorBean",beanDefinitionBuilder.getBeanDefinition());
//啟動spring應(yīng)用上下文
applicationContext.refresh();
//顯示的關(guān)閉spring應(yīng)用上下文
applicationContext.close();
}
static class POJO implements InitializingBean {
@PostConstruct // CommonAnnotationBeanProcessor
public void init() throws Throwable{
throw new Throwable("init() : For Purpose....");
}
public void afterPropertiesSet() throws Exception {
throw new Exception("For purposes.....");
}
}
}
面試題
ObjectBeanFactory 與 BeanFactory 的區(qū)別免都?
答:ObjectBeanFactory 與 BeanFactory均提供依賴查找的能力放妈。不過适袜,ObjectBeanFactory僅關(guān)注一個或一種類型的Bean的依賴查找兑凿,并且自身不具備依賴查找的能力谈为,能力由BeanFactory輸出湾揽。BeanFactory提供l單一類型瓤逼、集合類型及層次性等多種依賴查找的方式。
BeanFactory.getBean方法的執(zhí)行是線程安全的嗎?
答:BeanFactory.getBean方法的執(zhí)行是線程安全库物,操作過程中會添加互斥鎖抛姑。