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.")); } }