Olá galera,
Neste post falarei um pouco sobre o Spring Framework, uma das ferramentas mais fantásticas que conheci durante minha carreira como desenvolvedor de software. As áreas de atuação e o poder desta ferramenta se tornaram tão grandes após seu lançamento, que o fizeram ser um dos frameworks mais famosos e utilizados pela comunidade.
Quando se fala em Spring Framework, a maior parte dos desenvolvedores rapidamente o liga com aplicações Java Enterprise Edition (JEE). O que poucos sabem é que seus recursos não são limitados a plataforma JEE, muitos recursos podem ser utilizados com Java Standard Edition (JSE), como por exemplo, os padrões de Inversão de Controle e Injeção de Dependências, e isto que pretendo mostrar neste post.
Então vamos lá, para iniciar o que é esse tal de Spring ?
O Spring é uma tecnologia que surgiu para resolver o problema da complexidade encontrada nos Enterprise Java Beans (EJBs), sendo um framework que implementa os padrões de Inversão de Controle e Injeção de Dependência, juntamente os Patterns de Setter Injection e Constructor Injection, além de prover técnicas de boa programação fornecendo um modelo unificado e simples de programação, isto o tornou um sucesso em meio à comunidade de programadores, sucesso este, foi tão grande que na versão mais nova do JEE, diversas melhorias foram criadas baseadas no Spring Framework. [1]
O Spring Framework implementa dois padrões de grande sucesso na comunidade de programadores que são de Inversão de Controle e Injeção de Dependência, provendo sempre das boas técnicas de programação, sendo estas, baixo acoplamento e alta coesão. Com sua arquitetura baseada em Plain Old Java Object (POJOs), o principal objetivo do Spring Framework é tornar as tecnologias existentes atualmente no mercado fáceis de serem utilizadas.[1]
Como visto, devido ao sucesso do Spring, hoje é possível ter aplicações JEE com arquiteturas bastante simplificadas, uma vez que a partir da mudança do J2EE para o JEE a complexidade em se criar aplicações Java Web foi muito reduzida fazendo com que muitas empresas que tinham suas aplicações baseadas na plataforma J2SE migrassem para o JEE. Essa mudança fez o mercado de software ser o que é hoje, onde encontramos aplicações cada vez mais inovadoras e altamente conectadas.
Para este post montarei um pequeno exemplo utilizando Maven, JSE e Spring Framework.
Primeiro passo: Adicionar as dependências do Spring no pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.6.RELEASE</version> </dependency>
Segundo passo é criar o arquivo de configuração do Spring denominado de ApplicationContext dentro da pasta META-INF do projeto. Para este exemplo configurei apenas para escanear o pacote aonde crie as classes Java utilizadas.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- configuração para escaneamento de pacotes buscando e registrando os beans--> <context:component-scan base-package="com.exemplospringjse" /> </beans>
Após isso vamos criar a classe LoadContext e adicionar dois métodos:
1º – Carrega o ApplicationContext.xml
private static void initContext() { LOG.info("Carregando o contexto do spring"); ApplicationContext applicationContext = new ClassPathXmlApplicationContext("META-INF/ApplicationContext.xml"); autoRegister(applicationContext); }
2º – Transforma a classe LoadContext em um singleton para evitar instâncias desnecessárias
private static void autoRegister(ApplicationContext applicationContext) throws BeansException { LOG.info("Registratando contexto como singleton"); context = new StaticApplicationContext(applicationContext); context.registerSingleton("loadContext", LoadContext.class); }
Feito isso, nossa aplicação já estará apta a trabalhar com injeção de dependências gerenciadas pelo Spring Framework.
Vamos ao teste então.
Para testar criei uma classe simples da seguinte forma:
@Component public class TestDependecyInjection { Logger LOG = Logger.getLogger(TestDependecyInjection.class); public void testaInjecao(){ LOG.info("Injeção de dependência funcionando com sucesso"); } }
Feito isso é só executar.
public static void main(String[] args) { ApplicationContext context = LoadContext.getContext(); TestDependecyInjection teste = context.getBean(TestDependecyInjection.class); teste.testaInjecao(); }
Como resultado:
2015-04-03 19:32:07,359 INFO [com.exemplospringjse.LoadContext] (main) Carregando o contexto do spring
2015-04-03 19:32:07,454 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] (main) Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2f4813: startup date [Fri Apr 03 19:32:07 BRT 2015]; root of context hierarchy
2015-04-03 19:32:07,489 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (main) Loading XML bean definitions from class path resource [META-INF/ApplicationContext.xml]
2015-04-03 19:32:07,719 INFO [com.exemplospringjse.LoadContext] (main) Registratando contexto como singleton
2015-04-03 19:32:07,719 INFO [com.exemplospringjse.TestDependecyInjection] (main) Injeção de dependência funcionando com sucesso
Disponibilizei o projeto criado no GitHub neste link
Com isso encerro por aqui, até a próxima.
Referência:
[1] https://fernandogodoy.wordpress.com/2011/10/21/spring-framework/
[2] http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/