404 Not Found

404 Not Found


nginx

Como Funciona a Auto-Configuração do Spring Boot

A auto-configuração é o coração do Spring Boot—ela registra beans automaticamente com base nas classes no classpath, permitindo que você siga o princípio "convenção sobre configuração".

1. O Que Você Vai Aprender


2. Uma História Real de um Desenvolvedor de Framework

(1) Ponto de Dor: Ter que escrever várias configurações toda vez que se integra

A equipe de Alice precisa integrar um novo SDK de pagamento no OrderFlow. Toda vez que integram um novo componente, precisam escrever uma classe @Configuration, declarar beans, configurar propriedades e tratar o carregamento condicional. Bob, um membro da equipe, frequentemente trabalha até tarde por causa de conflitos de beans e dependências circulares; apenas configurar uma integração Redis levou três dias.

(2) Soluções de Auto-Configuração

O Spring Boot Starter simplifica "integrar um componente" para "adicionar uma dependência":

XML
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Uma vez adicionada essa dependência, a fábrica de conexão Redis e o RedisTemplate são ambos configurados automaticamente.

(3) Resultado

Depois que Alice criou o starter personalizado do OrderFlow, novos membros da equipe podem integrar o SDK de pagamento simplesmente adicionando uma única dependência—não há mais necessidade de configurar manualmente nenhum bean, e o tempo de integração foi reduzido de 3 dias para 30 minutos.


3. Mecanismo de Carregamento de Auto-Configuração

(1) De @EnableAutoConfiguration para AutoConfiguration.imports

100%
flowchart LR
    A["@EnableAutoConfiguration"] --> B["Import<br/>AutoConfigurationImportSelector"]
    B --> C["Read<br/>META-INF/spring/<br/>AutoConfiguration.imports"]
    C --> D["Filter via<br/>@Conditional<br/>Annotations"]
    D --> E["Register<br/>Qualified<br/>Auto-Configuration Classes"]
Versão Arquivo Carregado Formato
Spring Boot 2.x META-INF/spring.factories key=class1,class2
Spring Boot 3.x META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports Um nome de classe totalmente qualificado por linha
📌 Ponto-Chave: Spring Boot 3.x usa o novo arquivo AutoConfiguration.imports e não usa mais spring.factories para registrar auto-configuração.

(2) A Natureza das Classes de Auto-Configuração

Uma classe de auto-configuração é uma classe @Configuration com anotações condicionais:

(1) ▶ Exemplo: Simplificando o código-fonte da auto-configuração do DataSource

JAVA
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {

    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource(DataSourceProperties properties) {
        return DataSourceBuilder.create()
            .url(properties.getUrl())
            .username(properties.getUsername())
            .password(properties.getPassword())
            .build();
    }
}

Saída:

TEXT
// Execução bem-sucedida

4. Uma Explicação Detalhada das Anotações Condicionais

(1) Anotações de Condição Principais

Anotação Condições Aplicações Típicas
@ConditionalOnClass A classe especificada existe no classpath Só entra em vigor após a dependência ser incluída
@ConditionalOnMissingClass Classe não encontrada no classpath Fornece uma alternativa quando uma dependência está ausente
@ConditionalOnBean Um bean especificado existe no container Usado quando depende de outros beans
@ConditionalOnMissingBean O bean especificado não existe no container Fornece um bean padrão; cede para beans definidos pelo usuário quando disponível
@ConditionalOnProperty Propriedades de configuração atendem às condições Controla funcionalidades via interruptores de configuração

(1) ▶ Exemplo: Controle de Interruptor com @ConditionalOnProperty

JAVA
@Configuration
@ConditionalOnProperty(
    prefix = "orderflow.notification",
    name = "enabled",
    havingValue = "true",
    matchIfMissing = false
)
public class NotificationConfig {

    @Bean
    public NotificationService emailNotificationService() {
        return new EmailNotificationService();
    }
}

Saída:

TEXT
// Execução bem-sucedida
YAML
orderflow:
  notification:
    enabled: true   # Defina false para desabilitar notificação

(2) ▶ Exemplo: @ConditionalOnMissingBean fornece uma implementação padrão

JAVA
@Configuration
public class OrderFlowAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(IdGenerator.class)
    public IdGenerator uuidIdGenerator() {
        return new UuidIdGenerator();
    }

    @Bean
    @ConditionalOnMissingBean(OrderNumberGenerator.class)
    @ConditionalOnProperty(
        prefix = "orderflow.order",
        name = "number-prefix",
        havingValue = "ORD",
        matchIfMissing = true
    )
    public OrderNumberGenerator defaultOrderNumberGenerator() {
        return new SequentialOrderNumberGenerator("ORD");
    }
}

Saída:

TEXT
// Execução bem-sucedida

5. Starter Personalizado

(1) Convenções de Nomenclatura de Starter

Tipo Convenção de Nomenclatura Exemplo
Starter Oficial spring-boot-starter-* spring-boot-starter-web
Starter de Terceiros *-spring-boot-starter orderflow-spring-boot-starter

(2) Estrutura do Projeto Starter

TEXT
orderflow-spring-boot-starter/
├── src/main/
│   ├── java/com/orderflow/autoconfigure/
│   │   ├── OrderFlowAutoConfiguration.java
│   │   └── OrderFlowProperties.java
│   └── resources/
│       └── META-INF/spring/
│           └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
└── pom.xml

(1) ▶ Exemplo: Código completo de um Starter personalizado

JAVA
// OrderFlowProperties.java
@ConfigurationProperties(prefix = "orderflow.notification")
public record OrderFlowNotificationProperties(
    boolean enabled,
    String fromEmail,
    String templatePath
) {}

// OrderFlowAutoConfiguration.java
@AutoConfiguration
@ConditionalOnClass(JavaMailSender.class)
@ConditionalOnProperty(
    prefix = "orderflow.notification",
    name = "enabled",
    havingValue = "true"
)
@EnableConfigurationProperties(OrderFlowNotificationProperties.class)
public class OrderFlowAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(NotificationService.class)
    public NotificationService notificationService(
            OrderFlowNotificationProperties props) {
        return new EmailNotificationService(
            props.fromEmail(),
            props.templatePath()
        );
    }
}

Saída:

TEXT
Execução bem-sucedida
TEXT
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.orderflow.autoconfigure.OrderFlowAutoConfiguration

6. Depuração e Solução de Problemas da Auto-Configuração

(1) Modo --debug

Quando você adiciona o parâmetro --debug na inicialização, o Spring Boot emite um relatório de auto-configuração:

BASH
java -jar orderflow-service.jar --debug

(1) ▶ Exemplo: Interpretando o Relatório de Auto-Configuração

TEXT
============================
CONDITIONS EVALUATION REPORT
============================

Positive matches:
-----------------
   DataSourceAutoConfiguration matched:
      - @ConditionalOnClass found required class 'javax.sql.DataSource'

Negative matches:
-----------------
   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory'

Exclusions:
-----------
   None

Unconditional classes:
----------------------
   org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration

Saída:

TEXT
Execução bem-sucedida
Área do Relatório Significado
Positive matches Auto-configurações que atendem aos critérios e estão ativas
Negative matches Auto-configurações que não atendem aos critérios e não estão em vigor
Exclusions Auto-Configurações Explicitamente Excluídas
Unconditional Classes Auto-Configuração de Registro Incondicional

(2) Excluir auto-configuração

(2) ▶ Exemplo: Excluindo Auto-Configurações Indesejadas

JAVA
// Método 1: Exclusão por anotação
@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class
})
public class OrderFlowApplication { ... }

// Método 2: Propriedade de configuração
// application.yml
spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Saída:

TEXT
// Execução bem-sucedida
Método de Exclusão Cenários Aplicáveis Flexibilidade
@SpringBootApplication(exclude) Sempre Excluir Determinado em Tempo de Compilação
spring.autoconfigure.exclude Excluir por ambiente Variável em tempo de execução
@ConditionalOnProperty Excluir por critérios Mais flexível

7. Exemplo Abrangente: Implementação Completa do Starter de Notificação do OrderFlow

JAVA
// orderflow-notification-spring-boot-starter

// OrderFlowNotificationProperties.java
package com.orderflow.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "orderflow.notification")
public record OrderFlowNotificationProperties(
    boolean enabled,
    String fromEmail,
    String templatePath,
    SmtpConfig smtp
) {
    public record SmtpConfig(String host, int port, boolean ssl) {}
}

// NotificationService.java
package com.orderflow.autoconfigure;

public interface NotificationService {
    void send(String to, String subject, String body);
}

// EmailNotificationService.java
package com.orderflow.autoconfigure;

public class EmailNotificationService implements NotificationService {
    private final String fromEmail;
    private final String templatePath;

    public EmailNotificationService(String fromEmail, String templatePath) {
        this.fromEmail = fromEmail;
        this.templatePath = templatePath;
    }

    @Override
    public void send(String to, String subject, String body) {
        // Lógica de envio de email
        System.out.printf("Send to %s: [%s] %s%n", to, subject, body);
    }
}

// OrderFlowNotificationAutoConfiguration.java
package com.orderflow.autoconfigure;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

@AutoConfiguration
@ConditionalOnClass(name = "org.springframework.mail.javamail.JavaMailSender")
@ConditionalOnProperty(prefix = "orderflow.notification", name = "enabled", havingValue = "true")
@EnableConfigurationProperties(OrderFlowNotificationProperties.class)
public class OrderFlowNotificationAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(NotificationService.class)
    public NotificationService notificationService(OrderFlowNotificationProperties props) {
        return new EmailNotificationService(props.fromEmail(), props.templatePath());
    }
}
TEXT
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.orderflow.autoconfigure.OrderFlowNotificationAutoConfiguration

❓ Perguntas Frequentes

P As configurações automáticas e manuais entram em conflito?
R Não. Classes de auto-configuração usam extensivamente @ConditionalOnMissingBean. Se você definir manualmente um Bean do mesmo tipo, a auto-configuração automaticamente cederá a ele. Este é o princípio "definição do usuário tem precedência".
P Por que minha auto-configuração não está entrando em vigor?
R Causas comuns: 1) Uma classe de dependência está ausente no classpath; 2) A condição @ConditionalOnProperty não é atendida; 3) O caminho ou conteúdo do arquivo AutoConfiguration.imports está incorreto; 4) A classe de auto-configuração não está no escopo de scanning de componentes (mas auto-configuração é carregada via arquivo imports e não requer scanning).
P spring.factories ainda pode ser usado?
R Spring Boot 3.x ainda suporta spring.factories para compatibilidade reversa, mas você deve priorizar o uso de arquivos AutoConfiguration.imports para registrar auto-configurações. spring.factories será removido em versões futuras.
P Quantos módulos um Starter personalizado requer?
R Tipicamente dois: 1) o módulo autoconfigure (código de auto-configuração); 2) o módulo starter (pom.xml que agrega dependências). Para projetos simples, estes podem ser combinados em um único módulo.
P Como posso ver quais auto-configurações estão ativas atualmente?
R 1) Inicie a aplicação com o parâmetro --debug para visualizar o relatório; 2) Verifique o endpoint /actuator/conditions no Actuator; 3) Busque o arquivo AutoConfiguration.imports na sua IDE.
P Quais são os riscos de excluir a auto-configuração?
R Uma vez excluída, os recursos relacionados ficarão indisponíveis, e outras auto-configurações que dependem delas podem falhar. Certifique-se de entender as implicações da exclusão; você pode verificar a cadeia de dependências usando relatórios de debug.

📖 Resumo


📝 Exercícios

  1. Exercício Básico (Dificuldade ⭐): Inicie o projeto OrderFlow usando o modo --debug, liste todas as classes de auto-configuração entre os "Positive matches" e entenda as condições de classpath necessárias para cada auto-configuração.

  2. Exercício Avançado (Dificuldade: ⭐⭐): Crie um orderflow-spring-boot-starter que inclua um recurso de notificação controlado pelo interruptor @ConditionalOnProperty, depois integre-o no projeto OrderFlow e teste-o.

  3. Desafio (Dificuldade: ⭐⭐⭐): Implemente um sistema de auto-configuração que suporte múltiplas implementações—use notificações Kafka se Kafka estiver presente no classpath, notificações por email caso contrário, e notificações por log se nenhum dos dois estiver disponível. Considere a prioridade e o design de exclusão mútua das anotações condicionais.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%