Play FrameworkとSpring Frameworkの連携

最近、Play Frameworkにも手を出して、家で、いろいろやっているので、
今回は、Play Frameworkについてのエントリーです。
それで、Play Frameworkで、DIコンテナSpring Frameworkを使いたい場合の
連携方法に関して書きたいと思います。
やっぱり、DIしたいなぁと思ったので!!
まずは、最初にbuild.sbtにSpringに必要なものを設定します。

libraryDependencies ++= Seq(
  "org.aspectj" % "aspectjweaver" % "1.7.3",
  "org.springframework" % "spring-context" % "4.0.5.RELEASE",
  "org.springframework" % "spring-orm" % "4.0.5.RELEASE",
  "org.springframework" % "spring-jdbc" % "4.0.5.RELEASE",
  "org.springframework" % "spring-tx" % "4.0.5.RELEASE",
  "org.springframework" % "spring-expression" % "4.0.5.RELEASE",
  "org.springframework" % "spring-aop" % "4.0.5.RELEASE",
  "org.springframework" % "spring-test" % "4.0.5.RELEASE" % "test"
) 

設定が完了したら、playのコマンドで、Springをダウンロードさせます。

play dependencies

Springのダウンロードがうまく行ったら、
Playのグローバル設定を行う為、クラスを作成します。
ここで、Springの設定ファイルのapplicationContext.xmlを読ませて、
ApplicationContextを生成します。
PlayのGlobalSettingsクラスを継承した、ApplicationConfigurationクラスを作成します。

public class ApplicationConfiguration extends GlobalSettings {
	private static ApplicationContext context = null;
	private String lock = "lock";
	@Override
	public void onStart(Application application) {
		if (context == null) {
			synchronized(lock) {
				context = new FileSystemXmlApplicationContext(
						new String[] {"conf/applicationContext.xml"});
			}
		}
	}
	@Override
	public <A> A getControllerInstance(Class<A> clazz) {
		return context.getBean(clazz);
	}
}

configディレクトリにSpringのapplicationContext.xmlを作成します。
設定内容は、下記の内容です。

<?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:util="http://www.springframework.org/schema/util"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/util
		http://www.springframework.org/schema/util/spring-util-4.0.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/jee
		http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
		http://www.springframework.org/schema/lang
		http://www.springframework.org/schema/lang/spring-lang-4.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<!-- Autowire -->
	<context:component-scan base-package="logic,controllers" scoped-proxy="targetClass"/>
	<!-- AOP -->
	<aop:aspectj-autoproxy/>
</beans>

次にルーティングの設定をするので、これもconfigにあるroutesファイルを
下記の様に編集します。

GET     /                           @controllers.Application.index()

これで、連携の準備は、完了です。
あとは、コントローラーにインジェクションできるようになるので、
何らかのクラスを@Componentのアノーテションを付けて、
下の様に、コントローラークラスにインジェクションするように書くだけです。

@Service
public class Application extends Controller {
	@Autowired
	@Qualifier("logic")
	private Logic logic;
    public Result index() {
    	System.out.println(logic.getMessage());
        return ok(index.render("Your new application is ready."));
    }

}