Oi João,
O @Bean
serve para exportar uma classe para o Spring, para que ele consiga carregar essa classe e fazer injeção de dependência dela em outra classes.
Geralmente quando precisamos criar uma classe que o Spring vai gerenciar, basta criar a classe e anota-la com alguma anotação do Spring(@controller, @service, etc.). Por exemplo:
@Service
public class CalculadorDeImposto {
//metodos
}
Como a classe anterior foi anotada com @Service
, o Spring consegue fazer o carregamento dela e com isso podemos a injetar em outras classes. Por exemplo:
@Controller
public class VendaController {
@Autowired
private CalculadorDeImposto calculadorDeImposto;
}
Na classe controller anterior conseguimos injetar a classe CalculadorDeImposto
normalmente, pois o Spring conhece essa classe, já que a anotamos com @Service.
Mas o problema é quando temos alguma classe que não é nossa e queremos que o Spring também consiga a injetar. Por exemplo, uma classe que pertence à alguma biblioteca que você esteja utilizando no projeto.
Nesse caso não tem como colocar a anotação @Service
em cima da classe, pois ela não é uma classe nossa, que pertence ao nosso projeto, mas sim uma classe de uma biblioteca que não temos acesso.
O jeito então é criar um método que cria manualmente uma instancia dessa classe:
@Configuration
public class Configuracoes {
public ClasseDaBiblioteca criarObjetoDaBiblioteca() {
return new ClasseDaBiblioteca();
}
}
E para que o spring possa gerenciar esse objeto que criamos no método, para que assim a gente consiga o injetar em outras classes, precisamos anotar o método com @Bean
:
@Bean
public ClasseDaBiblioteca criarObjetoDaBiblioteca() {
return new ClasseDaBiblioteca();
}
Pronto! agora já é possível injetar essa classe via spring:
@Controller
public class VendaController {
@Autowired
private CalculadorDeImposto calculadorDeImposto;
@Autowired
private ClasseDaBiblioteca classeDaBiblioteca;
}