Notas de estudo do Spring - Anotações Mapper e MapperScan em Mybatis e algumas interfaces que não são mapeadores também serão processadas em mapeadores e criadas como um bean, e um erro será relatado ao iniciar

Sobre a experiência de uso do mybatis @MapperScan

1. Mybatis-spring-boot-starter deve ser referenciado, caso contrário, não poderá ser verificado para entrar em vigor. Ele pode ser substituído pelo mybatis-plus-boot-starter do mybatis-plus.

2. Pesquisando o MapperScan na Internet, a maioria deles diz que especifica a varredura de vários pacotes por meio do basePackage, o que não é um problema em si, mas não é uma solução perfeita. As razões são as seguintes:

(1) Se o nome do pacote verificado for de nível superior, algumas interfaces que não são mapeadores também serão processadas em mapeadores e criadas como um spring bean, causando falha na inicialização do sistema, o que definitivamente não é possível.

(2) Limite apenas o escopo do pacote, é melhor configurar apenas o pacote correspondente ao mapeador, mas se você listar todos os pacotes que contêm o mapeador, também haverá deficiências .

- Primeiro, fará com que a lista fique mais longa. Use curingas para resolver alguns problemas, mas a sacola precisa atender a algumas regras unificadas. Além disso, não é fácil lidar com situações de diferentes níveis.

- Em segundo lugar, reduz a escalabilidade, pois toda vez que você adiciona ou ajusta o pacote mapeador, é necessário registrá-lo no @MapperScan. Mudanças no código comercial afetam o código da estrutura. Principalmente no caso de múltiplos módulos, esse problema fica cada vez mais obscuro: quem diria que se for referenciado mais um módulo é necessário configurar o @MapperScan?

- Terceiro, viola o princípio da dependência.Originalmente, o framework não dependia do negócio, mas agora o framework tem que ajustar o código devido às mudanças no negócio.

Pontos principais:
3. Portanto, acho que a melhor maneira é usar os componentes basePackage + annotationClass no @MapperScan para resolver o problema.

(1) Adicione a anotação @Mapper a todos os mapeadores. Isto é razoável, porque o próprio mapeador pertence a um tipo especial de interface, que deve ser diferenciado por meio de registro especial.

(2) Com o Artigo 1, basePackage pode especificar um nome de pacote de nível superior

Através dos dois acima, por um lado, o problema de mudança dinâmica do pacote mapeador é resolvido, pois o código de negócio geralmente possui um prefixo de pacote unificado, normalmente com.cortName, então ele pode ser usado como basePackage, que só precisa deve ser configurado uma vez. As alterações subsequentes não são afetadas.

Exemplo:

@MapperScan(basePackages = {
    
    "com.package1", "com.package2"}, annotationClass = Mapper.class)

As duas anotações @Mapper e @MapperScan são anotações que serão usadas na combinação de Spring e Mybatis .

Então, qual é a diferença entre essas duas anotações? vamos dar uma olhada

@Mapper

1. Função: Adicionar @Mapper à classe de interface gerará automaticamente uma classe de proxy dinâmica para a interface anotada por @Mapper

Adicionar local: acima da classe de interface

2. Adicione a anotação @Mapper a cada interface que precisa implementar a classe, o que é relativamente complicado

@MapperScan

1. Função: Configure um ou mais caminhos de pacote, verifique automaticamente as classes nesses caminhos de pacote e gere automaticamente classes proxy para eles.

Adicionar local: é adicionado acima da classe de inicialização Springboot

2. Após a anotação @MapperScan, você pode personalizar o pacote de digitalização, como @MapperScan("com.xxx.xx"). Com esta anotação, você não precisa adicionar anotações @Mapper uma por uma

3. @MapperScan possui muitos atributos, os mais comumente usados ​​são:

annotationClass : 这个是基于包下面扫描所有的接口类并注册,也有指定的属性。   
markInterface : 基于包下面扫描所有接口类并注册,也可以指定特殊的接口为父类。
sqlSessionTemplateRef: 在指定使用sqlSessionTemplateRef的情况下,这里有一个或多个的Spring的容器。经常我们会使用一个或多个的数据库.
sqlSessionFactoryRef : 在指定使用sqlSessionFactoryRef的情况下,这里有一个或多个的Spring的容器。经常我们会使用一个或多个的数据库.
​nameGenerator :Spring的容器中,将使用BeanNameGenerator去命名检测到的组件。basePackageClasses : 这是一个安全替代basePackages()作为指定组件的扫描包。包下面的所有接口都将会被扫描。
basepackages : 基于包下面的扫描MyBatis的接口。注意是,只有是接口的将会被扫描注册,如果是具体的类将会被忽略。

Acho que você gosta

Origin blog.csdn.net/qq_43842093/article/details/132639217
Recomendado
Clasificación