This is a simple application demonstrating how to integrate a Play 2.0 application components with Spring framework.
Note that the same technique can be applied to any other dependency injection framework.
There is a few places where the Spring binding is done.
In the project/Build.scala
file, add a dependency to spring-context
:
import sbt._
import Keys._
import PlayProject._
object ApplicationBuild extends Build {
val appName = "play-spring"
val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq(
"org.springframework" % "spring-context" % "3.0.7.RELEASE"
)
val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
// Add your own project settings here
)
}
We wiil use dynamic controller dispatching instead of the statically compiled dispatching used by default in Play framework. To do that, just prefix your controller class name with the @
symbol in the routes
file:
GET / @controllers.Application.index()
The controllers instances management will be delegated to the Global
object of your application. Here is an implementation of the Global
using Spring framework:
import play.*;
import org.springframework.context.*;
import org.springframework.context.support.*;
public class Global extends GlobalSettings {
private ApplicationContext ctx;
@Override
public void onStart(Application app) {
ctx = new ClassPathXmlApplicationContext("components.xml");
}
@Override
public <A> A getControllerInstance(Class<A> clazz) {
return ctx.getBean(clazz);
}
}
And here is the associated conf/components.xml
file we are using to configure Spring:
<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="controllers,services,dao"/>
</beans>
In this example we are using the annotation driven binding for Spring (so we use the annotations provided in org.springframework.stereotype
to mark our components as Spring managed).
First a simple "Spring style" service:
package services;
@org.springframework.stereotype.Service
public class HelloService {
public String hello() {
return "Hello world!";
}
}
And now the controller with the service autowired:
package controllers;
import play.*;
import play.mvc.*;
import views.html.*;
import services.*;
import org.springframework.beans.factory.annotation.*;
@org.springframework.stereotype.Controller
public class Application extends Controller {
@Autowired
private HelloService helloService;
public Result index() {
return ok(index.render(helloService.hello()));
}
}
You can then integrate any Spring componenents to your application. The auto-reload feature will just work magically. If you plan to use a database or an ORM, you could want to manage it directly via Spring instead of using the default Play plugins.