Un Bean è un POJO (Plain Old Java Object), gestito dal contenitore a molla.
I contenitori a molla creano solo un'istanza del bean per impostazione predefinita. Questo bean è memorizzato nella cache in modo che tutte le richieste per il bean restituiranno un riferimento condiviso allo stesso bean.
L'annotazione @Bean restituisce un oggetto che spring registra come bean nel contesto dell'applicazione. La logica all'interno del metodo è responsabile della creazione dell'istanza.
Quando utilizziamo l'annotazione @Bean?
Quando la configurazione automatica non è un'opzione. Ad esempio, quando vogliamo collegare i componenti da una libreria di terze parti, perché il codice sorgente non è disponibile, quindi non possiamo annotare le classi con @Component.
Uno scenario in tempo reale potrebbe essere che qualcuno vuole connettersi al bucket Amazon S3. Poiché la fonte non è disponibile, dovrebbe creare un @bean.
@Bean
public AmazonS3 awsS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}
Fonte per il codice sopra -> https://www.devglan.com/spring-mvc/aws-s3-java
Perché ho citato l'annotazione @Component sopra.
@Component Indica che una classe annotata è un "componente". Tali classi sono considerate candidate per il rilevamento automatico quando si utilizza la configurazione basata su annotazioni e la scansione del percorso di classe.
L'annotazione del componente registra la classe come un singolo bean.