Spring,Spring,Spring
Spring framework, na minha opinião o melhor e mais completo framework que nos temos, pois revolucionou o modelo de desenvolvimento j2ee, ele inspirou o ejb3. Spring é um container, leve, muito leve, ele se integra como muitos outros frameworks, como jdo,hibernate,ibatis,jdbc,jms,etc... Ele não re-inventa a roda mas sim aperfeiçoá.
Nesse exemplo vou demostrar como fazer um acesso remoto a um Spring Bean como RMI, isso mesmo como se fosse um ejb. Vamos lá.
*Estou usando spring 2.0 E as libs que vem como o proprio spring + as dependencias como
log e por ai vai.
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
Para testar: Rode a classe: SpringContextHolderUtil e depois(Não para a execução da classe SpringContextHolderUtil) rode: TestRMI.
A classe: SpringContextHolderUtil Sobe o Contexto do Spring(digamos spring server) e expoe o Bean CromService como um RMI e a classe: TestRMI sobe o contexto(spring client) e injeta CromService vindo do RMI para o bean Cimerio. Ao rodar você terá esse resultado:
Nesse exemplo vou demostrar como fazer um acesso remoto a um Spring Bean como RMI, isso mesmo como se fosse um ejb. Vamos lá.
*Estou usando spring 2.0 E as libs que vem como o proprio spring + as dependencias como
log e por ai vai.
package org.diegopacheco.springrmitest.service;
public interface CromService {
public String rezar();
}
package org.diegopacheco.springrmitest.service;
public class CromServiceImpl implements CromService {
public String rezar() {
return "Você rezou de mais então Crom mandou uma maldição de sua montanha.";
}
}
package org.diegopacheco.springrmitest.util;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* CLASSE que manterá o Spring Factory Beans no 'Ar'
* @author Diego Pacheco
*
*/
public class SpringContextHolderUtil {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:spring-remote-beans.xml"});
BeanFactory factory = (BeanFactory) context;
System.out.println("*** Spring Factory Beans: " + factory + " on Air... ");
System.out.println("*** Para finalizar, derube na mão essa class.");
//while(true){} Esse qhile true não é necessário pois o Spring já mantem o contexto
// no ar. Valeu pietro :)
}
}
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %C{1} - %m%n
log4j.logger.org.diegopacheco.springrmitest=INFO
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans
default-autowire="no"
default-dependency-check="none"
default-lazy-init="false"
>
<!-- Define o bean Cimerio -->
<bean
id="cimerio"
class="org.diegopacheco.springrmitest.service.client.Cimerio"
>
<!-- Injeta cromSerivce(vindo do RMI) -->
<property name="cromService" ref="cromService" />
</bean>
<!-- Prove a criação do bean 'cromSerivce' via RMI -->
<bean id="cromService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1199/CromService" />
<property name="serviceInterface" value="org.diegopacheco.springrmitest.service.CromService" />
</bean>
</beans>
Arquivos de conmfiguração e Spring beans(Coloque no classpath)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans
default-autowire="no"
default-dependency-check="none"
default-lazy-init="false"
>
<!-- Definição do Bean CromServiceImpl -->
<bean
id="cromService"
class="org.diegopacheco.springrmitest.service.CromServiceImpl"
/>
<!-- Expoe o Bean CromServiceImpl como RMI(tipo EJB) -->
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- does not necessarily have to be the same name as the bean to be exported -->
<property name="serviceName" value="CromService"/>
<property name="service" ref="cromService"/>
<property name="serviceInterface" value="org.diegopacheco.springrmitest.service.CromService"/>
<!-- defaults to 1099 -->
<property name="registryPort" value="1199"/>
</bean>
</beans>
package org.diegopacheco.springrmitest.service.client;
import org.diegopacheco.springrmitest.service.CromService;
public class Cimerio {
private CromService cromService;
public Cimerio() {}
public Cimerio(CromService cromService) {
super();
this.cromService = cromService;
}
public void rezarParaCrom(){
System.out.println(cromService.rezar());
}
public CromService getCromService() {
return cromService;
}
public void setCromService(CromService cromService) {
this.cromService = cromService;
}
@Override
public String toString() {
return "Crom...";
}
}
package org.diegopacheco.springrmitest.service.client;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestRMI {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:spring-client-beans.xml"});
BeanFactory factory = (BeanFactory) context;
Cimerio conan = (Cimerio) factory.getBean("cimerio");
System.out.println("Conan reza para Crom e: ");
conan.rezarParaCrom();
}
}
Para testar: Rode a classe: SpringContextHolderUtil e depois(Não para a execução da classe SpringContextHolderUtil) rode: TestRMI.
A classe: SpringContextHolderUtil Sobe o Contexto do Spring(digamos spring server) e expoe o Bean CromService como um RMI e a classe: TestRMI sobe o contexto(spring client) e injeta CromService vindo do RMI para o bean Cimerio. Ao rodar você terá esse resultado:
INFO RmiClientInterceptor - RMI stub [rmi://localhost:1199/CromService] is an RMI invoker
INFO DefaultAopProxyFactory - CGLIB2 available: proxyTargetClass feature enabled
Conan reza para Crom e:
Você rezou de mais então Crom mandou uma maldição de sua montanha.