Guicing up the Play Framework: Dependency Injection with Guice and Play
One of the features lacking out of the box for Play is Dependency Injection. Coming from a background of JEE, this seemed to be quite a significant omission.
Fortunately, it is not very difficult to set it up. This article will take you through the steps of adding Guice to your Play application.
-
The first step is to add the Guice dependency to your build.sbt file or Build.scala (if you’re using Play 2.1.X or lower). Your build.sbt should look like this:
-
Now let’s create a simple service that we will be injecting into our controller. First create an interface at the path app/services/GreetingService.java.
Followed up by its implementation here: app/services/RealGreetingService.java
-
Now let’s go to the Application controller and inject the GreetingService into it. The key things here are the instance variable with the @Inject annotation and the controller index method not being static anymore, as it needs access to the greetingService instance variable.
-
Go to your routes file and put an @ in front of the index route to indicate that it is no longer static.
-
Lastly, create a Global.java class at app/Global.java. Create an injector and override the getControllerInstance method to return instances from the injector. When a route has a prefix of @, Play will call this method.
-
If this has all worked, you should be able to run the application and see the message by visiting http://localhos:9000.
Your greeting should appear like the screenshot below.
I’ve uploaded the sample application here.