Dev (Back & Front)ARTIGO

Integrando Spring em aplicativos legados

Uma das coisas que todos os desenvolvedores Spring gostam de fazer é inserir Spring em qualquer aplicativo em que trabalham – é um dos meus prazeres secretos na vida: você vê algum código, acha que é lixo por ele conter vários antipadrões conhecidos e depois pensa no quão legal seria se esse aplicativo fosse um app Spring.

Ao trabalhar com código legado, você não pode convertê-lo em um aplicativo Spring plenamente desenvolvido do dia para a noite, isso leva tempo. O que você precisa fazer é adicionar código Spring pouco a pouco de cada vez: peça por peça, e existe uma boa maneira de fazer isso.

No cenário a seguir, você está trabalhando em algum código legado e você escreveu um Spring bean chamado MySpringBean e precisa usar a classe legacy LegacyAppClass.

A classe legada se parece com isto:

public class LegacyAppClass {
  // some old code goes here

  public void legacyDoSomethingMethod() {
    System.out.println("This is so old it doesn't use a logger....");
  }
}
… enquanto seu novo SpringBean é parecido com isto:
<code>public class MySpringBean {</code></code>private LegacyAppClass injectedBean;

@Override
public String toString() {
return "The toString()";
}

public LegacyAppClass getInjectedBean() {
return injectedBean;
}

public void setInjectedBean(LegacyAppClass injectedBean) {
this.injectedBean = injectedBean;
}

public void myDoSomethingMethod() {
injectedBean.legacyDoSomethingMethod();
}

}</pre>




<p>… como você pode ver, o método <em>myDoSomethingMethod()</em> precisa chamar o método <em>legacylegacyDoSomethingMethod()</em>.</p>
<p>Dado que qualquer aplicativo legado terá a sua própria maneira de criar vários objetos, e que seu novo código Spring vai precisar usar esses objetos para ter seu trabalho feito, então você precisa encontrar uma maneira de combinar os objetos legados com seus novos objetos. Isso geralmente envolve adicionar os objetos legados em seu contexto Spring e injetá-los em seus objetos; e para fazer isso você precisa do <em>StaticApplicationContext</em> do Spring.</p>
<pre><code>@Test public void loadExternalClassTest2() {</code>

LegacyAppClass myInstance = new LegacyAppClass();
GenericApplicationContext parentContext = new StaticApplicationContext();

parentContext.getBeanFactory().registerSingleton("injectedBean",
myInstance);
parentContext.refresh(); // seems to be required sometimes

ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "SpringIntegrationExample.xml" }, parentContext);

MySpringBean mySpringBean = context.getBean(MySpringBean.class);
assertNotNull(mySpringBean);

mySpringBean.myDoSomethingMethod();

System.out.println(mySpringBean.toString());
}</pre>
<p>No código teste acima, o primeiro ponto a salientar é que eu criei uma instância de <em>LegacyAppClass</em> para uso do teste, mas em um aplicativo do mundo real ele já terá sido criado em algum lugar em sua base de código legado. As próximas três linhas são onde a mágica acontece…</p>
<pre><code>GenericApplicationContext parentContext = new StaticApplicationContext();</code>

parentContext.getBeanFactory().registerSingleton("injectedBean",
myInstance);
parentContext.refresh(); // seems to be required sometimes</pre>
<p>… no trecho acima, você pode ver que eu estou criando um <em>StaticApplicationContext</em> e programaticamente adicionando minha instância da classe legada a ele.</p>
<pre><code>ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "SpringIntegrationExample.xml" }, parentContext);

A tarefa final, como mostrado acima, é, então, criar um novo aplicativo Spring contexto usando qualquer método que seja adequado para o seu projeto. Nesse caso, eu usei o proverbial ClassPathXmlApplicationContext, mas outros tipos de app contexto funcionam tão bem quanto.

Você pode dizer que esse é um exemplo Micky Mouse simples, mas com a experiência ele escalona muito bem. Está sendo usado atualmente por alguns aplicativos Estratégia MVC de estilos antigos de fullscale Frente JSP.

Finalmente, no interesse da abrangência completa, a seguir está a configuração do XML para este exemplo:

<?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 id="mySpringBean">
  <property name="injectedBean" ref="injectedBean"/>
 </bean>
</beans>

***

Texto original disponível em http://www.captaindebug.com/2012/03/integrating-spring-into-legacy.html

Trabalha na empresa Bet365 desde 2012. É um programador e desenvolvedor Java com certificado em Sun, com considerável experiência em todos os aspectos do ciclo de desenvolvimento em ambientes financeiros. Seus recentes projetos incluem o uso de Java, Spring e Oracle.

Ver perfil