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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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:
@BeanA 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!