Um Bean é um POJO (Plain Old Java Object), que é gerenciado pelo contêiner de primavera.
Os contêineres Spring criam apenas uma instância do bean por padrão. Esse bean é armazenado em cache na memória para que todas as solicitações para o bean retornem uma referência compartilhada para o mesmo bean.
A anotação @Bean retorna um objeto que registra a primavera como um bean no contexto do aplicativo. A lógica dentro do método é responsável por criar a instância.
Quando usamos a anotação @Bean?
Quando a configuração automática não é uma opção. Por exemplo, quando queremos conectar componentes de uma biblioteca de terceiros, porque o código fonte não está disponível, não podemos anotar as classes com @Component.
Um cenário em tempo real pode ser que alguém queira se conectar ao bucket do Amazon S3. Como a fonte não está disponível, ele teria que criar um @bean.
@Bean
public AmazonS3 awsS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}
Origem do código acima -> https://www.devglan.com/spring-mvc/aws-s3-java
Porque mencionei a anotação @Component acima.
@Component Indica que uma classe anotada é um "componente". Essas classes são consideradas candidatas à detecção automática ao usar a configuração baseada em anotação e a verificação do caminho da classe.
A anotação de componente registra a classe como um único bean.