参考自己写的代码:
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
总结:
- 通常代码中使用 @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)
案例2:在注解配置类appconfig 中 通过 @bean 所管理的bean
他们的装配模型是构造器3