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 模式

证据:有一个 Autowire 枚举类(它),其中有一个 isAutoWire的方法在这里插入图片描述
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)

在这里插入图片描述

案例2:在注解配置类appconfig 中 通过 @bean 所管理的bean

在这里插入图片描述
他们的装配模型是构造器3

发布了36 篇原创文章 · 获赞 0 · 访问量 2553

猜你喜欢

转载自blog.csdn.net/qq_39965727/article/details/104379918