Mentawai Web Framework

Integração com Spring

Obs: Antes de você decidir por utilizar o Spring, você deve notar que o Mentawai possui um container de IoC bastante poderoso, flexível e fácil de usar, que resolve a maioria das suas necessidades de IoC (Inversão de Controle) e DI (Injeção de Dependência) automaticamente e de forma transparente. Por favor cheque as seções correspondentes sobre IoC e DI antes de optar por utilizar o Spring junto com o Mentawai.

O Spring (http://www.springframework.org) é um container de IoC e um framework de integração que vem crescendo bastante atualmente. Sendo assim, como não poderia deixar de ser, o Mentawai oferece uma integração bastante simples e de dois modos distintos para que você possa escolher o que melhor se adapta ao seu gosto ou necessidade.


SpringActionConfig

Nesse modo, as actions são tratadas como beans do Spring, isto é, tanto a action quanto suas dependências podem ser configuradas no arquivo beans.xml do Spring:

<beans>
  <bean id="helloBean" class="examples.spring.HelloBean"/>	
  <bean id="helloAction" class="examples.spring.HelloAction" singleton="false">
    <property name="helloBean"><ref local="helloBean"/></property>
  </bean>
</beans>

A classe HelloAction acima é uma action normal, que extende de BaseAction. Note que ela possui uma dependência, o "helloBean", que será tratada/injetada pelo Spring. Para indicar no nosso ApplicationManager que a HelloAction será gerenciada pelo Spring, tudo que temos que fazer é usar a SpringActionConfig, que é uma subclasse de ActionConfig:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
SpringActionConfig.setBeanFactory(beanFactory);

// Ruby style

spring("/hello", "helloAction")
    .on(SUCCESS, fwd("/index.jsp"));

// Java style
    
SpringActionConfig ac = new SpringActionConfig("/hello", "helloAction");
ac.addConsequence(SUCCESS, new Forward("index.jsp"));
addActionConfig(ac);

Note que devemos informar ao SpringActionConfig a BeanFactory do Spring que será usada, através do método estático setBeanFactory. Note também que não referenciamos a classe da action diretamente, mas sim o nome que foi dado a ela no arquivo beans.xml do Spring, nesse caso "helloAction". Assim, bastando que a action tenha um método setter setHelloBean, o Spring se encarregará de resolver a dependência e injetar o HelloBean dentro da action.


SpringFilter

O segundo modo de integração é baseando em um Filtro (org.mentawai.core.Filter). Através dessa abordagem, não é necessário configurar a action no arquivo beans.xml, e pode-se utilizar o input da action para obter os beans que estão sendo gerenciados pelo Spring. Basta fazer:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));

// Ruby style

filter(new SpringFilter(beanFactory)); // global filter

action("/springFilterAction", SpringFilterAction.class)
    .on(SUCCESS, fwd("/index.jsp"))
    
// Java style

addGlobalFilter(new SpringFilter(beanFactory)); // global filter

ActionConfig ac = new ActionConfig("/myAction", SpringAction.class);
ac.addConsequence(SUCCESS, new Forward("/index.jsp");
addActionConfig(ac);
    

Considerando que o arquivo beans.xml do Spring contem um bean chamado "helloBean", basta que a action faça um input.getValue("helloBean"), para obter o bean diretamente do Spring.

Você pode usar qualquer um dos dois modelos, escolhendo o seu preferido. Para maior clareza, você pode também clicar aqui para baixar um exemplo de integração do Mentawai com o Spring.

WebApplicationContext

Nos exemplos acima, criamos a BeanFactory manualmente. Contudo, você também pode usar o WebApplicationContext, interface que estende de BeanFactory, apenas configurando o web.xml. Veja por exemplo:

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

Dessa forma, o Spring vai automaticamente procurar pelo WEB-INF/applicationContext.xml e criar a BeanFactory. Essa é a forma recomendada pelo Spring para se fazer integração a outros frameworks. Você pode ter mais informações na Documentação do Spring.