Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre o @Bean

Boa tarde Rodrigo,

Acredito que não é o foco desse curso, mas você poderia explicar mais sobre esse @Bean? Já vi em outros lugares, mas não entendo quais métodos usam o @Bean e quais não usam.

Como o Spring trabalha com essa anotação?

Obrigado pela ajuda!

2 respostas
solução!

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;
}

Obrigado pela explicação Rodrigo!