15 de agosto de 2026 • Java

04 - Escopo do Spring Bean

O Escopo de Bean do Spring define o ciclo de vida e a visibilidade de um Bean dentro do Container IoC do Spring. Os escopos determinam quantas instâncias serão criadas e quando serão reutilizadas.

Escopos

  • singleton: Uma única instância compartilhada para todo o Container IoC do Spring (padrão)
  • prototype: Uma nova instância é criada toda vez que o Bean é solicitado
  • request: Uma instância por requisição HTTP (somente em aplicações web)
  • session: Uma instância por sessão HTTP (somente em aplicações web)
  • application: Uma instância por sessão ServletContext (somente em aplicações web)
  • websocket: Uma instância por sessão WebSocket.

Escopo Singleton

O escopo singleton cria apenas uma instância de um Bean para todo o Container IoC do Spring.

@Service
public class EmailService {

}

this is equivalent to:

@Service
@Scope("singleton)
public class EmailService {

}
# another example, sharing the same instance and counter variable

@Service
public class CounterService {
  private int counter = 0;

  public int increment() {
    return ++counter;
  }
}

@RestController
public class AController{
  @Autowired
  private CounterService counterService;
}

@RestController
public class BController{
  @Autowired
  private CounterService counterService;
}

# both controllers receive the same instance, so the counter variable is shared.

Características

  • Escopo padrão do Spring
  • Apenas uma instância por Container IoC
  • Criado quando o Application Context inicia (por padrão)
  • Compartilhado em toda a aplicação
  • A segurança de thread é responsabilidade do desenvolvedor

Escopo Prototype

O escopo prototype cria uma nova instância toda vez que é solicitado ao Container Spring.

@Component
@Scope("prototype")
public class ReportGenerator {

}

Características

  • Nova instância a cada solicitação
  • Não compartilhado
  • O Spring gerencia apenas a criação do Bean
  • A destruição do Bean é responsabilidade da aplicação

Ao contrário dos beans singleton, o Spring não invoca callbacks de destruição (como @PreDestroy) para beans prototype. O desenvolvedor é responsável por destruir beans prototype quando eles possuem recursos que necessitam de limpeza explícita, pois o Spring não invoca callbacks de destruição para beans com escopo prototype.

Escopo Request

Disponível apenas em aplicações web, cria um Bean por requisição HTTP.

@Component
@RequestScope
public class UserContext {

}

Escopo Session

Disponível apenas em aplicações web, cria um Bean por sessão HTTP.

@Component
@SessionScope
public class UserContext {

}

Escopo Application

Disponível apenas em aplicações web, cria um Bean por ServletContext.

@Component
@ApplicationScope
public class UserContext {

}

Este escopo é semelhante ao singleton, mas seu ciclo de vida está atrelado ao ServletContext em vez de diretamente ao Container IoC do Spring.

Escopo WebSocket

Cria um Bean para cada sessão WebSocket. Cada cliente conectado recebe sua própria instância do Bean.

@Component
@Scope("websocket")
public class UserContext {

}

Escolhendo o Escopo Correto

  • Use singleton quando:

    1. O Bean é stateless (sem estado).
    2. O Bean fornece serviços compartilhados (por exemplo, @Service, @Repository, @Controller).
    3. Você deseja minimizar a criação de objetos e melhorar o desempenho.
  • Use prototype quando:

    1. O Bean mantém estado que não deve ser compartilhado.
    2. Cada consumidor precisa de sua própria instância independente.
    3. Bom para usar quando precisa lidar com processadores de arquivos, trabalhos de importação/exportação, geradores de relatórios, detentores de dados temporários, contextos de análise (parsing).
  • Use request, session, ou websocket apenas em aplicações web quando o ciclo de vida do Bean deve seguir o contexto HTTP ou WebSocket correspondente.

← Voltar para o blog