Pular para conteúdo

Padrões no Spring

O Spring usa e viabiliza muitos padrões, mas uma anotação não é, por si só, um padrão. Entender a colaboração e o mecanismo em runtime evita uso mecânico de stereotypes.

Mapa de padrões

Mecanismo Spring Padrão ou princípio Distinção importante
Contêiner IoC e injeção por construtor Dependency Injection / IoC DI não é Dependency Inversion
BeanFactory e FactoryBean Factory FactoryBean cria outro objeto exposto
Escopos de bean Ciclo de vida gerenciado Singleton é por definição e contêiner
Advice AOP Proxy / cadeia de interceptores A chamada deve atravessar o proxy aplicável
JdbcTemplate e similares Template com estratégia callback Fluxo de recurso/erro é fixo; operação varia
DispatcherServlet Front Controller Uma entrada coordena o despacho
Handler adapters Adapter Estilos distintos cabem no mesmo despacho
Eventos Observer Evento no processo não é broker durável
Repositórios Spring Data Repository Acesso aparece como papel semelhante a coleção
Filter chain de segurança Chain of Responsibility Ordem e curto-circuito importam

Dependency Injection

O contêiner cria beans e fornece colaboradores. Injeção por construtor torna dependências obrigatórias explícitas e referências completamente inicializadas e imutáveis.

@Service
final class PlaceOrder {
    private final OrderRepository orders;
    private final PricingPolicy pricing;

    PlaceOrder(OrderRepository orders, PricingPolicy pricing) {
        this.orders = orders;
        this.pricing = pricing;
    }
}

O padrão não exige interface para toda classe. Introduza abstração quando houver papel estável, implementações múltiplas, limite arquitetural ou substituto de teste significativo.

Escopo singleton não é o Singleton do GoF

O escopo padrão pede ao contêiner uma instância por definição de bean. A classe não precisa de construtor privado ou getInstance(), e outro contexto pode ter outra instância. Beans singleton não devem guardar estado mutável de requisição sem sincronização.

Comportamento transversal por proxy

Spring AOP aplica transações, cache, segurança, async e advice por proxies. Conforme configuração e tipo, usa proxies por interface ou classe.

sequenceDiagram
    participant Caller
    participant Proxy
    participant Advice
    participant Target
    Caller->>Proxy: method call
    Proxy->>Advice: before / around
    Advice->>Target: proceed
    Target-->>Advice: result or exception
    Advice-->>Proxy: transformed outcome
    Proxy-->>Caller: result or exception

No modo comum, autoinvocação não atravessa o proxy; chamar método em this não ativa advice separado. Métodos privados não são interceptados por override, e tipos/métodos final restringem proxies por classe. Projete e teste esses limites como comportamento, não decoração. Para cache, chaves, atualidade, invalidação, capacidade e stampede permanecem decisões da aplicação.

Template e callback

APIs Spring no estilo template centralizam aquisição, limpeza e tradução de exceções. Callback, lambda ou estratégia fornece a etapa específica. Isso difere do Template Method por herança, embora preserve o esqueleto do algoritmo.

Eventos e comunicação de domínio

Eventos desacoplam publisher e listeners no processo. Defina entrega síncrona ou assíncrona, falhas e transações. Para integração durável, use broker/outbox; evento em memória não sobrevive à falha. O guia de outbox explica durabilidade e duplicatas.

Uso cuidadoso

  • Service Locator por ApplicationContext#getBean oculta dependências.
  • Um repositório por tabela pode expor persistência, não intenção do domínio.
  • Uma interface com uma implementação não é errada, mas o Spring não a exige.
  • Eventos excessivos obscurecem fluxo e responsabilidade por falhas.
  • Serviço/controller base genérico pode apagar contratos por reutilização superficial.

Referências oficiais