Olá!
Estou gostando muito do curso. Mas acho que não entendi um conceito que é muito falado no Spring: Afinal, o que é um Bean? Como funcionam as anotações? Existe algum material complementar que possa ser indicado para entender isso?
Olá!
Estou gostando muito do curso. Mas acho que não entendi um conceito que é muito falado no Spring: Afinal, o que é um Bean? Como funcionam as anotações? Existe algum material complementar que possa ser indicado para entender isso?
Oi Leonardo,
Posso tentar te explicar por aqui.
Na verdade isso é algo meio complicado, pois no "mundo" Java existem muitas tecnologias que utilizam o termo bean
, que é uma palavra que faz analogia com os grãos de café, ao qual o Java é relacionado :D
No próprio Java existe o termo Java Bean
, que geralmente representa uma classe Java tradicional, ou seja, que não depende de nenhum framework. Java Bean então é apenas uma classe com atributos e métodos getters/setters. Por exemplo:
public class Aluno {
private String nome;
private String email;
private String matricula;
//getters e setters
}
Já no caso do framework Spring
, um bean
seria alguma classe que ele gerencia, ou seja, que ele conhece e sabe como instanciar e injetar em outras classes.
Mas para o Spring conhecer uma classe como sendo um bean, devemos configurá-la de alguma maneira. As duas principais maneiras são:
@Bean
A primeira maneira consiste em adicionar uma anotação na própria classe. Por exemplo:
@Component
public class CalculadorDeJuros {
//...
}
A anotação @Component
indica ao Spring que essa classe é um bean(também chamado de componente) e que ele deve instanciá-la quando ela for injetada em alguma outra classe, como em um controller por exemplo.
Só que a anotação @Component
é muito genérica, pois ela não deixa claro que tipo de componente que aquela classe é.
Pensando em melhorar esse problema de semântica, depois outras anotações foram criadas: @Controller
, @Service
e @Repository
.
Todas essas anotações fazem a mesma coisa: indicam ao Spring que a classe é um bean que ele deve gerenciar. O que muda é apenas a semântica do tipo de bean que a classe representa.
Já a segunda maneira consiste em criar um método que devolve o objeto que você quer configurar como um bean do Spring. Por exemplo:
public class ConversorDeDatas {
private String formatoPadrao;
public ConversorDeDatas(String formatoPadrao) {
this.formatoPadrao = formatoPadrao;
}
//...
}
@Configuration
public class BeanConfigurations {
@Bean
public ConversorDeDatas getConversorDeDatas() {
return new ConversorDeDatas("dd/MM/yyyy");
}
}
Repare que nessa segunda maneira não foi necessário adicionar nenhuma anotação na classe ConversorDeDatas
, deixando ela menos "poluida" com as anotações dos frameworks.
Mas para o Spring conseguir injetar essa classe, precisamos configurá-la com o @Bean
.
O @Bean
também é interessante quando a classe que queremos configurar como um bean não possui um construtor default(que não recebe argumentos), como no exemplo acima da classe ConversorDeDatas
, ou quando a classe não é do nosso projeto(por exemplo, uma classe de alguma biblioteca que utilizamos).
Espero que tenha entendido um pouco melhor agora :)
Bons estudos!
Entendi sim. Então pode-se dizer que um Java Bean é um POJO? Se não, quais as diferenças?
Oi Leonardo,
Sim, são dois nomes diferentes para a mesma coisa.
Se não me engano quem criou esse termo POJO foi o Martin Fowler, pois a ideia era chamar esse tipo de classe de Simple Object
, mas as pessoas poderiam não utilizar porque daria a impressão de que eram objetos "simples" e não seriam interessantes em um projeto :D
Dai surgiu o termo POJO(Plain Old Java Object), que por ser um termo mais "chique" e atrativo, as pessoas talvez dessem mais atenção.
Abraços!