BeanDefinitionRegistryPostProcessor注解
這種方式和第七種比較像
要實現兩個方法
第一個方法是實現工廠
第二個方法叫后處理bean注冊
package com.bigdata1421.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}}
跟之前的寫法一樣
package com.bigdata1421.bean;import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import com.bigdata1421.bean.service.impl.BookServiceImpl2;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinition beanDefinition= BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl2.class).getBeanDefinition();registry.registerBeanDefinition("yellow",beanDefinition);}}
我們操作配置類
我們首先Config8注入一個新的
類加載器
package com.bigdata1421.config;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import(BookServiceImpl1.class)
public class SpringConfig8 {
}
我寫一個APP8去拿bean
package com.bigdata1421.bean.app;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.config.SpringConfig7;
import com.bigdata1421.config.SpringConfig8;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App8 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig8.class);BookService bookService = ctx.getBean("bookService", BookService.class);bookService.check();}
}
看一下業務層的實現類
package com.bigdata1421.bean.service.impl;import com.bigdata1421.bean.service.BookService;
import org.springframework.stereotype.Service;@Service("bookService")
public class BookServiceImpl1 implements BookService {@Overridepublic void check() {System.out.println("1");}
}
名字叫bookService
運行
打印
這里我們導入一個bean
這就相當于有人在系統中已經定義好了
我們現在用register注冊bean
我們這時候注入兩個bean
package com.bigdata1421.config;import com.bigdata1421.bean.MyRegistrar;
import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import({BookServiceImpl1.class, MyRegistrar.class})
public class SpringConfig8 {}
Myregistrar里面是這樣寫的
思考
我們在這邊注入的是兩個類加載器
bean是同一個bean
但無論我們怎么調換順序
都是打印的這個
這種加載bean的順序是有講究的
小結
在Spring框架中,Bean的底層數據結構通常是使用HashMap或ConcurrentHashMap來存儲的。具體來說,Spring使用一個名為BeanFactory的接口來管理Bean,其默認實現是DefaultListableBeanFactory,它內部使用一個ConcurrentHashMap來存儲所有的Bean實例,以及它們的相關信息。
這種設計使得Spring能夠高效地管理大量的Bean,并且支持并發訪問。通過HashMap或ConcurrentHashMap,Spring能夠根據Bean的名稱或類型快速查找和訪問相應的Bean實例,同時還能夠處理Bean的依賴注入和生命周期管理等功能。
ConcurrentHashMap 是 Java 中的一個線程安全的哈希表實現,它是對 HashMap 的改進版本,專門用于在多線程環境下進行并發操作。
主要特點包括:
-
分段鎖設計:
-
ConcurrentHashMap 內部通過將整個 Map 分割為多個 Segment(段),每個 Segment 默認是一個 HashEntry 數組,各自維護一部分數據,因此不同 Segment 的數據可以同時被多個線程訪問,提高了并發訪問效率。
-
每個 Segment 內部都是一個類似于 HashMap 的結構,使用 synchronized 關鍵字來保證線程安全。
-
-
線程安全性:
-
ConcurrentHashMap 允許多個線程同時讀取,不會出現讀取數據時的阻塞情況(非阻塞讀取)。
-
對于寫操作(put、remove 等),只會鎖住相關的 Segment,而不是整個 Map,因此多個線程可以同時執行寫操作,從而提高了寫操作的并發性能。
-
-
適用場景:
-
ConcurrentHashMap 特別適用于多線程并發訪問的場景,例如在高并發的 Web 應用中,作為緩存或者共享數據的存儲結構,能夠提供較好的性能表現。
-
在 Java 并發框架中,ConcurrentHashMap 是非常重要的組成部分,被廣泛應用于各種需要高效并發訪問的場景。
-
-
迭代器特性:
-
ConcurrentHashMap 的迭代器是弱一致性的(Weakly Consistent),即迭代器可以讀取到其他線程改變后的數據,但不會拋出 ConcurrentModificationException 異常,因此可以在遍歷的同時進行修改操作,但可能會讀取到一些舊數據。
-
總體來說,ConcurrentHashMap 通過分段鎖和優化的數據結構設計,實現了在高并發情況下的高效讀寫操作,是 Java 并發編程中常用的工具之一。
個人號推廣
博客主頁
朱道陽-CSDN博客
Web后端開發
https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482
Web前端開發
https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482
數據庫開發
https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482
項目實戰
https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482
算法與數據結構
https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482
計算機基礎
https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482
回憶錄
https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482