terça-feira, 18 de setembro de 2012

JAVA + Spring + Netbeans 7.2 - Lesson 02



Posts Anteriores : 
JSNBTut - Base  que é uma preparação do ambiente para o desenvolvimento

Opcionais : 
JSNBTut - Lesson 1 - introdução ao Spring

Continuando o estudo com o Spring, neste post iremos incrementar o post anterior mostrando como o spring gerencia as dependências entre objetos.



1- Crie um novo projeto Java >> Java Application
Figura 01- Novo projeto Java
2 - Dê o nome de SpringLesson02 e assinale a opção  Create Main Class springlesson02.SpringLesson02

Figura 02 - Nome do projeto e classe principal
3- Adicione a Lib Spring conforme o passo 3  do Post anterior
Figura 03- Clique em add Library e Adicione a lib Spring
4 - Vamos criar um arquivo XML de nome beans-definitions.xml na pasta src de nosso projeto
Figura 04 - novo arquivo XML

Figura 05 - arquivo beans-definitions.xml

Figura 06 - arquivo beans-definitions.xml


conteúdo do arquivo beans-definitions.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean name="emailSender1" class="springlesson02.EmailSender">
    <property name="name" value="Mario Cezzare"></property>
    <property name="emailAddress" value="mcezzare@gmail.com"></property>
</bean>
<bean name="emailMessage1" class="springlesson02.EmailMessage">
    <property name="contents" value="hello from lesson 02"></property>
    <property name="from" ref="emailSender1"></property>
</bean>
</beans>

Observe que a propriedade from do beam emailMessage1 em vez de value usa o atributo ref, que referencia o beam emailSender1


5 - Vamos criar uma interface Message e adicionar uma função getMessage
public String getMessage();
Clique com o botão direito no projeto e escolha new>> java interface
Figura 07 - Interface Message


conteúdo do arquivo Message.java
package springlesson02;

public interface Message {
    
       public String getMessage();
       
}

6 - Vamos criar uma interface Sender e adicionar uma função getDetails
public String getDetails();
Clique com o botão direito no projeto e escolha new>> java interface
Figura 08 - Interface Sender



conteúdo do arquivo Sender.java
package springlesson02;

public interface Sender {
       public String getDetails();
}
7 - Vamos criar a classe EmailMessage que implementa a interface Message
Figura 09 - Implementando a Interface Message

Figura 10 - Classe EmailMessage : Implementando a Interface Message
I) Arquivo EmailMessage.java, crie duas variáveis do tipo String : contents e from
package springlesson02;

public class EmailMessage {

    public String contents;
    public Sender from;
    
}

II) Clique com botão direito neste arquivo EmailMessage.java e escolha a opção Refactor >> Encapsulate fields
Figura 11 -  Refatoração e Encapsulamento

Veja as opções e clique em Refactor
Figura 12 - Refatorando

Esse arquivo deve estar assim:
package springlesson02;

public class EmailMessage {

    private String contents;
    private Sender from;

    /**
     * @return the contents
     */
    public String getContents() {
        return contents;
    }

    /**
     * @param contents the contents to set
     */
    public void setContents(String contents) {
        this.contents = contents;
    }

    /**
     * @return the from
     */
    public Sender getFrom() {
        return from;
    }

    /**
     * @param from the from to set
     */
    public void setFrom(Sender from) {
        this.from = from;
    }
    
}

III) e precisamos que essa classe implemente a interface Message. Para isso adicione o texto implements Message após o nome da Classe. Veja que o NB reclamou.

Figura 13 - implementando a interface message

isso acontece porque ao implementar uma interface, se nossa classe não for abstrata, precisamos implementar  todos os métodos abstratos. Clique na lampada no nº da linha e escolha a opção implement all abstract methods,  e vamos modificar o retorno da função getMessage()


conteúdo do arquivo EmailMessage.java
package springlesson02;

public class EmailMessage implements Message {

    private String contents;
    private Sender from;

    /**
     * @return the contents
     */
    public String getContents() {
        return contents;
    }

    /**
     * @param contents the contents to set
     */
    public void setContents(String contents) {
        this.contents = contents;
    }

    /**
     * @return the from
     */
    public Sender getFrom() {
        return from;
    }

    /**
     * @param from the from to set
     */
    public void setFrom(Sender from) {
        this.from = from;
    }

    @Override
    public String getMessage() {
        return from.getDetails() + " wrote: " + this.contents;
    }
    
}


IV) Agora vamos criar a classe EmailSender que implementa a interface Sender e vamos modificar o retorno da função getDetails()

Figura 14 - Classe Email Sender


Figura 15 - Classe Email Sender

Com a classe criada, crie duas variáveis do tipo String name e emailAddress. já conhece a dica, né?
Vamos encapsular as variáveis e gerar os Gets/Sets, clique com o botão direito no código fonte do arquivo e escolha a opção Refactor >> Encapsulate fields

Figura 16 - Refatoração e Encapsulamento

 Clique no botão Select All e em Refactor

Figura 17 - Refatorando


conteúdo do arquivo EmailSender.java
package springlesson02;


public class EmailSender implements Sender{
    private String name;
    private String emailAddress;

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the emailAddress
     */
    public String getEmailAddress() {
        return emailAddress;
    }

    /**
     * @param emailAddress the emailAddress to set
     */
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    @Override
    public String getDetails() {
                return this.name + "<" + this.emailAddress+">";
    }
}
8 - Agora vamos colocar em nosso método main do programa, que está na classe springlesson02.SpringLesson02 a chamada p/ utilização do método  getBean do nosso bean emailMessage1, através da instância de um objeto do tipo ClassPathXmlApplicationContext do Spring Framework que recebe como parâmetro um arquivo XML :

Figura 18 - Layout do projeto

Já sabemos que ao usar os objetos e classes da linha 19, o NB fará a sugestão de importar as libs necessárias. Clique na lâmpada que aparece no nº da linha e escolha a sugestão de importar as 2 libs do spring org.springframework.context.ApplicationContext e org.springframework.context.support.ClassPathXmlApplicationContext

Então o arquivo final fica assim:

package springlesson02;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringLesson02 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ApplicationContext ctx= new ClassPathXmlApplicationContext("beans-definitions.xml");
        Message message1 = (Message)ctx.getBean("emailMessage1");
        System.out.println(message1.getMessage());
    }
}


e pronto.Vamos rodar no projeto e ver se funcionou. Clique no botão RUN (ícone de play) , ou no menu Run >> Run Project , e veja o resultado na aba output :

Figura 19 - Resultado Final

O resultado deve ser :
Mario Cezzare<mcezzare@gmail.com> wrote: hello from lesson 02


E assim concluímos nossa lição 02.

Resumo : o que foi feito ?
Utilizamos a classe ApplicationContext p/ gerenciar o contexto de nossa App. Informamos a ela que as definições dos serviços estão em um arquivo XML, através do objeto ClassPathXmlApplicationContext.

Implementamos uma interface Message através da classe EmailMessage p/ retornar o conteúdo das propriedades contents,from do nosso bean emailMessage1 através  do método getMessage() da interface Message



Implementamos uma interface Sender através da classe EmailSender p/ retornar o conteúdo das propriedades name,emailAddress do nosso bean emailSender1 através  do método getDetails() da interface Sender

Observou que o beam emailSender1 foi chamado automágicamente pelo beam emailMessage1 por causa do atributo ref="emailSender1" ?


Download do projeto NB
SpringLesson02


Dúvidas, Contribuições, Sugestões? Poste..
Grato,
Até a próxima.


Nenhum comentário: