你还在把 @Component 注解到 Mapper 上嘛

4,047 阅读1分钟

mapper 接口怎么被spring管理的

  • 1.通过 @MapperScan 扫描到对应的接口
  • 2.对接口进行动态代理,代理类做到的事情就是拿到sql,连接数据库,执行sql
  • 3.通过spring扩展机制 FactoryBean将代理对象交给spring管理

为什么 mapper 不用注解 @Component 也能生效

    1. ClassPathMapperScanner实现 springClassPathBeanDefinitionScanner
  • 2.在registerFilters方法中做了下面这件事情,这个是spring的ClassPathBeanDefinitionScannerdoScan方法中会判断是否需要包装成BeanDifition,这边都直接返回 true,表示,都需要,所以会把@MapperSacn 配置的包全部扫描进去
      addIncludeFilter(new TypeFilter() {
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory         metadataReaderFactory) throws IOException {
          return true;
        }
      });
  • 3.所以在 mapper 接口上根本就不用配置 @Component 注解