使用Spring作为2.4.x的依赖注入框架?
我正在探索play-scala 2.4.2并试图让春季DI与它一起工作。 我发现在2.4.x中有很多变化,覆盖GlobalSettings.getControllerInstance的旧方式似乎不再是一种选择。
我遇到了这个项目https://github.com/jroper/play-spring,但它似乎更像是一个POC,证明Spring DI是可能的,但似乎不像以前的游戏版本那么容易。 这是否会成为当前和未来游戏版本的弹簧整合机制,或者游戏社区很快就会有一个更简单的机制或框架?
请按照以下步骤操作:
第1 步 :在build.sbt文件中添加弹簧依赖关系。
libraryDependencies += "org.springframework" % "spring-context" % "4.1.6.RELEASE"
libraryDependencies += "org.springframework" % "spring-core" % "4.1.6.RELEASE"
libraryDependencies += "org.springframework" % "spring-beans" % "4.1.6.RELEASE"
libraryDependencies += "org.springframework" % "spring-aop" % "4.1.6.RELEASE"
第2步:创建一个新的类( ApplicationGlobalSettings.java )并使用GlobalSettings类实现。
package com.ranga.global.settings;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import play.Application;
import play.GlobalSettings;
public class ApplicationGlobalSettings extends GlobalSettings {
private static final String APPLICATION_CONTEXT_XML = "applicationContext.xml";
private ConfigurableApplicationContext applicationContext;
@Override
public void beforeStart(Application application) {
super.beforeStart(application);
}
@Override
public void onStart(Application application) {
super.onStart(application);
applicationContext = new ClassPathXmlApplicationContext(APPLICATION_CONTEXT_XML);
}
@Override
public void onStop(Application application) {
super.onStop(application);
if(applicationContext != null) {
applicationContext.close();
}
}
}
第3步:在conf文件夹( applicationContext.xml ) conf applicationContext.xml下创建一个新的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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.ranga.services, com.ranga.daos"/>
</beans>
第4步:将新创建的GlobalSettings文件位置添加到应用程序配置文件( conf / application.conf )。
.....some more configuration here.....
# Global Objects class
application.global=com.ranga.global.settings.ApplicationGlobalSettings
第5步:在com.ranga.service包(HelloWorldService.java)下创建一个新的服务类。
package com.ranga.services;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.ranga.daos.HelloWorldDAO;
@Service
public class HelloWorldService {
@Inject
private HelloWorldDAO helloWorldDAO;
public String sayHello() {
return helloWorldDAO.sayHello();
}
}
第6步:在com.ranga.daos包( HelloWorldDAO.java )下创建一个新的dao类。
package com.ranga.daos;
import org.springframework.stereotype.Repository;
@Repository
public class HelloWorldDAO {
public String sayHello() {
return "Hello Ranga!";
}
}
Step7:最后在Application.java文件中注入HelloWorldService 。
package com.ranga.controllers;
import javax.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import com.ranga.services.HelloWorldService;
import play.*;
import play.mvc.*;
import views.html.*;
public class Application extends Controller {
@Inject
private HelloWorldService helloWorldService;
public Result index() {
return ok(index.render(helloWorldService.sayHello()));
}
}
第8步:最后修改index.scala.html文件代码。
@(message: String)
<h1>@message</h1>
现在完成..运行应用程序。
Play的最新版本:
创建类Global(旧全局比扩展GlobaSettings):
@Singleton
public class Global {
private static final String APPLICATION_CONTEXT = "applicationContext.xml";
private ConfigurableApplicationContext applicationContext;
@Inject
public Global( ApplicationLifecycle lifecycle ) {
applicationContext = new ClassPathXmlApplicationContext(APPLICATION_CONTEXT_XML);
lifecycle.addStopHook( () -> {
applicationContext.close();
return F.Promise.pure( null );
});
}
}
创建类ConfigurableApplicationContextModule:
public class ApplicationContextModule extends AbstractModule {
@Override
protected void configure() {
bind( Global.class ).asEagerSingleton();
}
}
在application.conf中添加:
play.modules.enabled += "config.ApplicationContextModule"
创建文件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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="services, dao"/>
</beans>
在创建Ranga的上述内容之后
为了万一它可以帮助某人,我还开发了一个基于jroper项目的解决方案:https://github.com/jroper/play-spring。 关键是使用Spring的扫描功能来“加载”Play类:
ctx.scan(packages:_*)
与默认游戏的包:
def defaultPackages(): Seq[String] = Seq("router", "play", "controllers")
该解决方案适用于1 hack:您需要在Play类的@Singleton注释旁边添加@ javax.inject.Named,以便Spring可以扫描它们并加载它们(例如,您需要“分离”Play版本使用,但它是一个相当小和容易的变化)。 所以这里是我的SpringApplicationLoader示例应用程序:https://github.com/remithieblin/play24_spring
链接地址: http://www.djcxy.com/p/27485.html上一篇: Using Spring as a dependency injection framework with play 2.4.x?
下一篇: Checking If User has Modified Facebook Permission For App