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#getBeanoculta 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.