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

Explicação de conceitos

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?

3 respostas
solução!

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:

  1. Via anotação na própria classe
  2. Via método anotado com @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!