參考自己寫的代碼:
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
總結:
- 通常代碼中使用 @autoWired 不是自動裝配的byType模型 而是 No 模型,
只是它借用了byType的技術(因爲它會先按類型找,無則按name找,
–>最後是由 Feild.setxxx (@autoWired用在字段上時) 或者 method.invoke()(@autoWired用在方法上時)), - 並且如果採用全註解開發spring話,默認應該是無法直接使用到 除開 No模型的以外其他幾種 裝配模型(xml中可以方便指定單個bean的自動裝配模型),
- 如果想要在全註解的開發中真對所指定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)