# JavaBeans

JavaBeans são componentes de software escritos na linguagem de programação Java. Segundo a especificação da Sun Microsystems os JavaBeans são "componentes reutilizáveis de software que podem ser manipulados visualmente com a ajuda de uma ferramenta de desenvolvimento". Um bean também pode ser definido como uma classe Java que expõe propriedades, seguindo uma convenção de nomenclatura simples para os métodos getter e setter. Praticamente são classes escritas de acordo com uma convenção em particular. São usados para encapsular muitos objetos em um único objeto (o bean), assim eles podem ser transmitidos como um único objeto em vez de vários objetos individuais. O JavaBean é um Objeto Java que é serializável, possui um construtor nulo (construtor vazio - construtor noarg) e permite acesso às suas propriedades através de métodos getter e setter.
Apesar da semelhança nos nomes, os JavaBeans não devem ser confundidos com os Enterprise JavaBeans, ou EJBs, que são componentes utilizados em servidores e são parte da plataforma Java EE.
A origem do termo (significativa ou não) vem do sinônimo da palavra Java, utilizada popularmente nos EUA com o significado de café (daí a associação da linguagem a uma xícara de café), e beans (palavra em inglês que significa "grãos"), fazendo uma analogia de que o café é produzido de grãos que encapsulam seu sabor.

## Convenções utilizadas nos JavaBeans

Para ser considerada como um JavaBean, uma classe precisa seguir algumas convenções de nomenclatura de métodos, construtores e comportamento. Estas convenções permitem a existência de ferramentas que podem utilizar e manipular os JavaBeans.
As convenções definem que a classe:
* implemente a interface java.io.Serializable (que possibilita a persistência e restauração do estado do objeto da classe);
* possua um construtor sem argumentos;
* que as suas propriedades sejam acessíveis através de métodos "get" e "set", seguindo um padrão de nomenclatura;
* possa conter qualquer método de tratamento de eventos.
Como estes requisitos são expressos em convenções ao invés de serem garantidos através de uma interface, alguns programadores vêem os JavaBeans como Plain Old Java Objects que seguem certas convenções de nomenclatura. Porém, esta visão é enganosa para JavaBeans que suportam tratamento de eventos, já que as convenções de nomenclatura neste caso são mais complexas e pedem a utilização de classes como base e a implementação de interfaces. O java beans é bastante usado por programadores em jsp ou seja (Java Server Page) onde através deles implementam construtores de classes e métodos.

## Vantagens da utilização dos JavaBeans

* As propriedades,eventos e métodos de um bean que são expostas a outra aplicação podem ser controladas.
* Um bean pode registrar e receber eventos vindos de outros objetos e gerar eventos que serão enviados a esses outros objetos.
* Java Beans podem ser configurados com a ajuda de softwares auxiliares.
* As configurações de um bean podem ser salvas em algum meio de armazenamento persistente.

## Desvantagens da utilização dos JavaBeans

* Uma classe com um construtor nulo pode ser instanciada contendo um estado inválido. Se tal classe for instanciada manualmente pelo desenvolvedor(ao invés de automaticamente por algum tipo de framework), o desenvolvedor pode não perceber que essa classe foi instanciada de forma impropria. O compilador não pode detectar tal problema, e mesmo se for possível documentá-lo, nada garante que outros desenvolvedores vão verificar a documentação.
* A necessidade de criar um getter/setter para toda propriedade, pode gerar código duplicado. Apesar que existem plugins como o lombok que podem contornar essa questão criando os métodos em tempo de compilação, evitando que o desenvolvedor perca tempo escrevendo código repetido.

## API JavaBeans

A funcionalidade do JavaBeans é provida por uma série de classes e interfaces no pacote java.beans.
| Interface | Descrição |
| AppletInitializer | Métodos nesta interface são usados para inicializar Beans que também são applets. |
| BeanInfos | Esta interface permite que o designer especifique informação a respeito de eventos,métodos e propriedades de um Bean. |
| Customizer | Esta interface permite que o designer forneça uma interface gráfica através onde um bean possa ser configurado. |
| DesignMode | Métodos nesta interface determinam se um bean está sendo executado no modo de design. |
| ExceptionListener | Um método nesta interface é chamado quando uma exception ocorre. |
| PropertyChangeListener | Um método nesta interface é chamado quando uma propriedade bound é alterada. |
| PropertyEditor | Objetos que implementam esta interface dão permissão ao designer de alterar e exibir o valor das propriedades. |
| VetoableChangeListener | Um método nesta interface é chamado quando uma Constrained property é alterada. |
| Visibility | Métodos nesta interface dão permissão ao bean de executar em ambientes onde uma GUI não está presente. |

## Exemplo Utilização Java Bean

Pessoa.java:
pessoa.jsp: