Abstração de Componentes Compartilhados
Em ambientes corporativos complexos, é frequente a necessidade de padronizar o acesso ao banco de dados entre múltiplos microsserviços. A melhor prática recomendada pelo ecossistema Spring Boot para este fim é a criação de uma biblioteca personalizada do tipo Starter. Isso permite encapsular configurações repetitivas de persistência, facilitando a manutenção e garantindo consistência técnica.
Estrutura Modular do Projeto
O desenvolvimento exige a divisão clara de responsabilidades. Precisamos estabelecer dois módulos distintos no nosso gerenciador de dependências:
- Módulo de Automação (Autoconfigure): Contém a lógica pura de configuração das beans e as regras de ativação.
- Módulo de Entrada (Starter): Funciona como um agregador de dependências, expondo apenas a API necessária para os projetos consumidores.
Implementação da Lógica de Configuração
Dentro do módulo responsável pela automação (autoconfigure), devemos criar a classe central que registrará os componentes de MyBatis. Utilizaremos anotações padrão do framework Spring para habilitar a detecção automática.
@Configuration
@AutoConfiguration
public class GerenciamentoMybatisAutomatico {
/**
* Define o bean necessário para gerenciar sessões de SQL com o banco de dados.
*/
@Bean
public SqlSessionFactoryBean instanciarFabricaSessoes(@Autowired DataSource fonteDeDados) {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBean();
// Vincula a conexão configurada ao gerenciador de sessões
builder.setDataSource(fonteDeDados);
return builder;
}
/**
* Responsável por varrer o código fonte em busca de interfaces mapeadoras.
*/
@Bean
public MapperScannerConfigurer definirConfiguradorDeMapeamento(BeanFactory factory) {
MapperScannerConfigurer scanner = new MapperScannerConfigurer();
// Identifica dinamicamente o pacote base através do contexto do Spring
List<string> pacotesContextuais = AutoConfigurationPackages.get(factory);
if (!pacotesContextuais.isEmpty()) {
scanner.setBasePackage(pacotesContextuais.get(0));
}
// Especifica qual anotação deve ser buscada nos arquivos de interface
scanner.setAnnotationClass(Mapper.class);
return scanner;
}
}</string>
Registro de Ativação Automática
Para que o Spring Boot reconheça essa classe durante a inicialização do aplicativo, é obrigatório registrar seu nome totalmente qualificado no arquivo de importação automático. O caminho padrão na estrutura de recursos deve seguir a hierarquia abaixo:
src/main/resources/META-INF/spring/- Arquivo alvo:
org.springframework.boot.autoconfigure.AutoConfiguration.imports
No conteúdo deste arquivo, insira simplesmente o nome completo da classe de configuração desenvolvida anteriormente, um por linha.
Criação do Módulo Agregador
O módulo final destinado à distribuição (starter) não deve conter lógica complexa. Sua função principal reside no gerenciamento do arquivo pom.xml, onde deve-se declarar a dependência interna sobre o módulo de automação criado no passo anterior. Isso permite que os desenvolvedores externos consumam apenas o artefato do starter sem expor detalhes internos de implementação.
Ajuste de Compatibilidade de Compilação
Ao utilizar versões modernas do JDK (como o Java 17 ou superior), pode ocorrer divergência nas configurações padrão do Maven. Para garantir que os artefatos sejam compilados corretamente e evitem erros de versão incompatível, atualize a seção de plugins de construção em ambos os arquivos pom.xml dos módulos:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
Substituição de Dependências Externas
Uma vez que o artefato personalizado seja publicado no repositório local ou remoto, os projetos aplicacionais devem remover as bibliotecas oficiais do MyBatis Spring Boot e substituí-las pela nova dependência criadora do starter proprietário. Isso garante que todas as regras de negócio e padrões de persistência definidos internamente sejam aplicados uniformemente.