spring 的 DI + MI + 4種自動裝配模型 (no--即含@Autowired + @resouce, byName, byType, byConstor)

參考自己寫的代碼:
https://github.com/wuda5/spring-relate/commit/6b044fefb4020dc20167ca43143ffdd40a41a372

先看幾個readme

在這裏插入圖片描述

spring種5中裝配模型

1、AUTOWIRE_NO = 0;(這個NO咋說呢,理解爲不使用自動裝配吧,spring默認的值)–默認NO【0】
這裏 NO, 一般使用的 @autoWired ,@Resource 都是屬於 默認 No 模式

2、AUTOWIRE_BY_NAME = 1;(通過名字自動裝配) --byName【1】
3、AUTOWIRE_BY_TYPE = 2;(通過類型自動裝配) --byType【2】-- 例子:Mybtis-spring
4、AUTOWIRE_CONSTRUCTOR = 3;(通過構造函數自動裝配)–byConstor【3】
5、AUTOWIRE_AUTODETECT = 4;(已經被標註過時,本文不再討論)–xxx

總結:

  1. 通常代碼中使用 @autoWired 不是自動裝配的byType模型 而是 No 模型,
    只是它借用了byType的技術
    (因爲它會先按類型找,無則按name找,
    –>最後是由 Feild.setxxx (@autoWired用在字段上時) 或者 method.invoke()(@autoWired用在方法上時)),
  2. 並且如果採用全註解開發spring話,默認應該是無法直接使用到 除開 No模型的以外其他幾種 裝配模型(xml中可以方便指定單個bean的自動裝配模型),
  3. 如果想要在全註解的開發中真對所指定bean 指定其自動裝配類型爲No模型以外的模型,則需要藉助spring 所提供的 外部擴展@import(如實現ImportBeanDefinitionRegistrar 接口,具體建代碼),將拿到的spring的bean註冊器registry,通過registry操作干預bean工廠中的bd建設,如在這裏就可以將
    某個bd的模型修改爲其他模型-
    ->如:
/**
 * 參考--https://juejin.im/post/5d99fcc7e51d457822796ea1
 * 自定義 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar
 * 干預xx
 * 需要在Appconfig上增加如下註解 @Import(MyImportBeanDefinitionRegistrar.class)
 *
 * */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

		GenericBeanDefinition autoModeServiceUpdateToByType = (GenericBeanDefinition) registry.getBeanDefinition("autoModeServiceUpdateToByType");
		GenericBeanDefinition autoModeServiceUpdateToByName = (GenericBeanDefinition) registry.getBeanDefinition("autoModeServiceUpdateToByName");
		GenericBeanDefinition autoModeServiceUpdateToByConstor = (GenericBeanDefinition) registry.getBeanDefinition("autoModeServiceUpdateToByConstor");


		autoModeServiceUpdateToByType.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
		autoModeServiceUpdateToByName.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);
		autoModeServiceUpdateToByConstor.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
	}

通過類型裝配的案例——Mybatis-spring

通過閱讀源碼,經過以下調用鏈可以看到Mybatis-spring的做法:
MapperScannerRegistrar#registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)
–>MapperScannerRegistrar#registerBeanDefinitions(AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry)
–>ClassPathMapperScanner#doScan(String… basePackages)
–>ClassPathMapperScanner#processBeanDefinitions(Set beanDefinitions)
processBeanDefinitions(Set beanDefinitions)方法中有如下代碼:
if (!explicitFactoryUsed) {
LOGGER.debug(() -> “Enabling autowire by type for MapperFactoryBean with name '” + holder.getBeanName() + “’.”);
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);

注意:
**Mybatis-spring通過這種方式,避免了使用@Autowired註解完成自動裝配,減少了對spring註解的依賴。
即–是少使用了spring中註解的作用??如:@Autowired 整個註解是在 spring-bean 中的,即避免maybits xxxxx不用依賴此項目

  • 這樣用自動裝配的好處–> 可以不用spring 的提供註解 @Autowired, 減少了於spring的耦合,爲外部xxx 擴展帶來可能!
  • 如:mybis-spring結合是就算通過 bytype,–參考read.me
-- 感覺到 spring 的精髓部分了!!!!!!,
沒有此功能,其他外部框架就無法結合spring??
因爲它們自身是沒有也不想用spring的項目代碼
解耦合!!!**

參考外部:[https://juejin.im/post/5d99fcc7e51d457822796ea1]
(https://juejin.im/post/5d99fcc7e51d457822796ea1)

在這裏插入圖片描述

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 2433
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章