terça-feira, 8 de julho de 2008

Usando o Spring para enviar e-mails

Olá amiguinhos,

Em uma de minhas pesquisas, percebi que não tem um material bem explicativo sobre o Spring quando se trata de usar outras bibliotecas ou frameworks para executar tal serviço. Um amigo me explicou a filosofia do Spring, que por sinal é bem simples. A partir daí, eu entendi como funciona e agora da pra por pra funcionar qualquer coisa.

O Spring é interessante quando você quer criar uma instancia única para a aplicação inteira. O Hibernate por exemplo, o objeto SessionFactory é gigantesco e ficar instanciando isso o tempo todo, ou mais de uma vez, vai causar uma lentidão no sistema. Eu migrei o meu sistema Open Source, usando Spring junto com o Hibernate, o tempo de resposta de uma transação, mudou surpreendentemente. Também estou usando o Spring com o JavaMail. Não notei muita diferença de velocidade, mas pode ser muito útil mais pra frente quando o sistema ter que enviar e-mails em massa automaticamente para os administradores. Quem quiser conferir meu sistema Open Source, acesse http://articulus.sourceforge.net

Bom, vamos ao que interessa. Já expliquei a filosofia do Spring, ele cria uma instancia única para trabalhar no sistema inteiro. Mas é claro que ele não faz só isso, mas é sua principal caracteristica. Crie um projeto qualquer e adicione as bibliotecas do Spring e do JavaMail. Primeiro de tudo, edite seu web.xml da seguinte forma:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:WEB-INF/classes/*.*</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>


Fazendo isso, o Spring vai procurar no contexto dele, os beans que serão instanciados. Próximo passo é criar um arquivo chamado applicationContext.xml. Se você criou um projeto pelo Maven, salve no diretório resources, senão salve em WEB-INF, junto com o web.xml.

Vamos criar os beans que serão instanciados da seguinte forma:

<?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-2.0.xsd">

<bean id="mailSender" autowire="byName"
class="org.springframework.mail.javamail.JavaMailSenderImpl">

<property name="host" value="mail.seuhost.com.br" />

</bean>


<bean id="mailMessage" autowire="byName"
class="org.springframework.mail.SimpleMailMessage">

<property name="from"
value="teste@teste.com.br" />
<property name="to"
value="outroteste@teste.com.br" />
<property name="subject"
value="Teste" />
<property name="text"
value="Teste do Spring com o JavaMail" />

</bean>


<bean id="sendMail" autowire="byName"
class="br.org.teste.SendMail">

<property name="mailSender" ref="mailSender" />

</bean>

</beans>


Agora o mais importante, você vai ter que criar as classes e seus atributos, exatamente como criou nos beans, assim o Spring vai fazer a injeção nos objetos conforme você declarou.

Crie uma classe chamada SendMail e um pacote chamado br.org.teste e salve a classe lá dentro. Crie a seguinte estrutura:

public class SendMail {

private JavaMailSender mailSender;
private SimpleMailMessage mailMessage;

public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}

public void setMailMessage(SimpleMailMessage mailMessage) {
this.mailMessage = mailMessage;
}

public void send() {
mailSender.send(mailMessage);
}
}


Reparam nas propriedades da classe? Possui os mesmos nomes dos beans, assim quando você for chamar o bean, ele vai fazer a injeção dos objetos pelo nome.

Agora crie uma classe que vai chamar o SendMail, pode ser um Servlet mesmo. Para chamar faça o seguinte:

ClassPathXmlApplicationContext ctx = 
new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml"});

SendMail send = (SendMail)ctx.getBean("sendMail");
send.send();


Simples né? Muita gente se embaralha totalmente no Spring, mas ele é mais simples do que parece. Eu também penei muito pra entender. Dizem por ae que não precisa invocar o contexto usando a classe ClassPathXmlApplicationContext, que o Spring faz a injeção automaticamente, mas nos meus testes ele só dava NullPointer dae eu desisti. Vou pesquisar mais. Amanhã ou depois eu posto como se faz para trabalhar com o Hibernate e Spring.

Enjoy...

0 comentários: