Edson Susumu Asaga susumu@computer.org JavaBeans Edson Susumu Asaga susumu@computer.org
O que é um Bean? Um JavaBean é um componente de software reutilizável que pode ser manipulado visualmente em uma ferramenta de construção.
O que caracteriza um Bean? A ferramenta de construção pode analisar suas características através de introspeção Pode se comunicar com outros objetos gerando eventos Suas propriedades podem ser personificadas usando a ferramenta de construção ou acessadas programaticamente Suporta persistência de forma que possa ser gravado depois de personalizado
Propriedades São atributos com nome de um Bean Java que podem afetar sua aparência ou comportamento Podem ser Somente de leitura Somente de escrita De leitura e escrita A operação de escrita de uma propriedade pode ter efeitos colaterais
Eventos São a mensagens que componente (Fonte do evento) envia para outros (Ouvintes) notificando a ocorrência de um acontecimento determinado. Os ouvintes de um evento implementam a interface através da qual receberão notificações do evento. A fonte do evento: Conhece os ouvintes do evento. Fornece funções padronizadas para registro e retirada de ouvintes do evento.
Métodos São métodos comuns podem ser chamados por outros objetos. A forma padrão é expor todos os métodos públicos de um Bean, mas um Bean pode escolher expor somente um subconjunto de seus métodos públicos.
Persistência Um Bean deve implementar a interface Serializable ou Externalizable para suportar o uso das APIs Java de serialização para implementar persistência Uma ferramenta também pode gerar código para restaurar o estado de um Bean
Introspecção Processo através do qual as ferramentas de construção descobrem as características dos Beans. Existem duas alternativas para informar as características de um Bean: Aderindo a convenções de nomenclatura. Fornecendo explicitamente informação sobre as características através de uma classe de informação de Bean. A classe de informação de Bean implementa um interface interface padrão, BeanInfo.
Convenções de Nomenclatura: Propriedade Para uma propriedade xxx do tipo T: método de leitura: getXxx(): T. Se T for boolean pode ser isXxx(): boolean ou getXxx(): boolean. método de escrita: setXxx(T).
Convenções de Nomenclatura: Evento Para um evento Yyy: método de registro de ouvintes addYyyListener(YyyListener). método de retirada de ouvintes removeYyyListener(YyyListener). a interface YyyListener estende a interface sem método java.util.EventListener e declara funções de notificação.
Beans e Concorrência Bean Java pressupõe um ambiente concorrente onde vários threads diferentes podem estar simultaneamente enviando eventos ou chamando métodos ou acessando propriedades O desenvolvedor do Bean deve garantir que o Bean se comporte apropriadamente sob acesso concorrente Para Beans simples isto pode ser tratado simplismente fazendo todos métodos sincronizados
Exemplo: TemporizadorListener package beanTemporizador; public interface TemporizadorListener extends java.util.EventListener { void temporizadorDisparou(Temporizador t); }
Exemplo: Propriedade intervalo package beanTemporizador; public class Temporizador implements Serializable { private long intervalo; public long getIntervalo() { return intervalo; } public void setIntervalo(long intervalo) { this.intervalo = intervalo;
Exemplo: Propriedade repetitivo public class Temporizador implements Serializable { private boolean repetitivo; public boolean isRepetitivo() { return repetitivo; } public void setRepetitivo(boolean repetitivo) { this.repetitivo = repetitivo;
Exemplo: addTemporizadorListener public class Temporizador implements Serializable { private transient ArrayList listenerList; public synchronized void addTemporizadorListener( TemporizadorListener listener) { if (listenerList == null ) { listenerList = new ArrayList(); } listenerList.add (listener);
Exemplo: removeTemporizadorListener public class Temporizador implements Serializable { private transient ArrayList listenerList; public synchronized void removeTemporizadorListener( TemporizadorListener listener) { if (listenerList != null ) { listenerList.remove(listener); }
Exemplo: dispareTemporizador public class Temporizador implements Serializable { private transient ArrayList listenerList; private void dispareTemporizador() { java.util.ArrayList list; synchronized (this) { list =(ArrayList)listenerList.clone(); } for (int i = 0; i < list.size (); i++) { ((TemporizadorListener)list.get(i)). temporizadorDisparou(this);
Introspector É uma classe utilitária que examina os Beans de acordo com as convenções de nomenclatura para descobrir suas características. Utiliza a API de reflexão. Possui o método getBeanInfo(Class): BeanInfo. Este método recebe uma Class e retorna um objeto que implementa a interface java.beans.BeanInfo que informa as propriedades, métodos e eventos do Bean.
Empacotamento de Beans Beans são empacotados e distribuídos em arquivo compactado do tipo JAR que contem: Arquivos de classes compiladas do Bean (.class) Arquivo manifesto que é um arquivo texto num formato padronizado que indica quais são as classes que são Beans
Referência Página JavaBeans na Web: http://java.sun.com/products/javabeans