Google App Engine是否支持Spring框架?
答案 0 :(得分:5)
如果说“Google Apps”实际上是在谈论“Google App Engine”(正如标签所示),那么,“大多数情况下”。请参阅here(我指向缓存页面,因为“它将在App Engine中播放”google groups post似乎只是无休止地旋转)。引用:
编辑:根据下面的@ hleinone评论,“大部分”答案现已变为“是” - Spring Security 3.x在Google App Engine上运行“开箱即用” (没有亲自尝试过,我只是相信有问题的评论!)。 [[结束编辑]]
Spring MVC
Version: 2.5.6
Status: COMPATIBLE
看看Spring的MVC框架在运行 在App Engine上,查看 autoshoppe示例应用程序。如果 你正在使用Spring表单(例如使用 spring-form.tld标签库和 继承SimpleFormController),你 将需要注册自定义编辑器 为您的财产。这包括在内 在 http://groups.google.com/group/google-appengine-java/browse_thread/thread/d93fd7385bf85bf7
Spring ORM
Version: 2.5.6
Status: COMPATIBLE
让Spring使用App 引擎提供的JPA接口,请关注 说明书 http://objectuser.wordpress.com/2009/05/19/spring-jpa-in-google-app-engine/, 讨论了解决方法 需要依赖于javax.naming @PersistenceContext。更复杂 解决方法可在 http://groups.google.com/group/google-appengine-java/browse_thread/thread/187d41712ec1d394
Spring Security
Version(s): ?
Status: SEMI-COMPATIBLE
解决问题 ClassNotFoundException,你可以使用一个 重新编译的库版本 这增加了一个 StringInsensitiveComparator类 - 下载是在 http://www.google-app-engine.com/blog/post/Spring-security-fix-for-google-app-engine.aspx。 看到 http://www.dotnetguru2.org/bmarchesson/index.php?p=1100 有关如何获得Spring Security的提示 运行App Engine和GWT(in 法国)。看到 http://groups.google.com/group/google-appengine-java/browse_thread/thread/964e7f5e42840d9c 关于整合的讨论。
答案 1 :(得分:1)
我听到的是,单独的春季启动时间使其不适合谷歌应用引擎。
真正的问题是,Spring是由VMWare购买的,用于他们自己的云战略。他们与谷歌应用程序引擎直接竞争。所以不要指望情况会好转。
答案 2 :(得分:0)
Google有一篇文章Optimizing Spring Framework for App Engine Applications。以下是要点的摘要,但是您应该完整阅读article。
减少或避免使用组件扫描
通过不使用Spring XML配置文件中的以下配置元素来禁用组件扫描:
<!-- Component scanning will significantly slow down application initialization time -->
<context:component-scan base-package=""/>
相反,明确声明您的依赖项,例如:
<bean id="myComponentBean" class="org.foo.MyComponent"/>
<bean id="myOtherComponentBean" class="org.bar.MyComponent"/>
减少或避免使用关系自动装配
让我们看看如何启用关系的“自动接线”。例如,考虑以下具有DAO成员的Spring MVC Controller类,
@Controller
@RequestMapping("/movie")
public class MovieController {
MovieDaoInterface movieDao;
public void setMovieDao(MovieDaoInterface movieDao) {
this.movieDao = movieDao;
}
}
Spring IoC使用以下XML配置来设置MovieController的成员属性。
<bean class="com.example.controller.MovieController">
<property name="movieDao" ref="movieDao"></property>
</bean>
<!-- movieDao is defined elsewhere in the container configuration -->
<bean id="movieDao" class="com.example.dao.MovieDao" />
相反,您可以使用spring配置文件中的 context:annotation-config 元素启用自动装配,并定义bean,如下所示:
<context:annotation-config /> <!-- Turn on Autowired -->
<bean class="com.example.controller.MovieController" autowire="byType">
</bean>
在生产中禁用XML验证
要进一步减少应用程序的加载时间,您可以按照以下步骤在生产环境中禁用XML验证:
- 创建一个扩展XmlWebApplicationContext的类。
- 覆盖 initBeanDefinitionReader方法。
- 将XmlBeanDefinitionReader验证模式设置为VALIDATION_NONE。如果App Engine应用程序在App Engine SDK中运行,则启用XML验证;在生产模式下运行时,则禁用XML验证。
import com.google.appengine.api.utils.SystemProperty;
public class Custom XmlWebApplicationContext extends XmlWebApplicationContext {
protected void init BeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
super.init BeanDefinitionReader(beanDefinitionReader);
if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
beanDefinitionReader.setValidating(false);
beanDefinitionReader.setNamespaceAware(true);
}
}
}
- 打开web.xml文件。
- 创建一个部分。
- 添加一个值为contextClass的元素。
- 添加一个元素,其值指向您之前创建的类。
<context-param>
<param-name>contextClass</param-name>
<param-value>com.example.CustomXmlWebApplicationContext</param-value>
</context-param>
使用惰性初始化Bean
Spring的ApplicationContext在初始化过程中创建并配置所有单例bean。这是理想的,因为如果存在配置错误,则会立即发现它们。但这会对增加应用程序加载时间产生负面影响。
对于寿命长的服务来说,这可能不是一个问题,这些服务只需启动一次,但对于App Engine应用程序的动态环境而言并不理想。
对于不经常使用的bean,并且在容器为第一个请求初始化时不需要的bean,可以通过将lazy-init属性设置为true来缓解此问题。 < / strong>
避免按名称进行构造子注入
Spring 3.0添加了对使用构造函数参数名称消除歧义的支持。让我们以以下示例类为例:
public class Movie {
private String name;
private String synopsis;
public Movie(String name, String synopsis) {
this.name = name;
this.synopsis = synopsis;
}
}
使用名称注入的相应配置如下所示:
<bean id="movie" class="example.Movie">
<constructor-arg name="name" value="ET" />
<constructor-arg name="synopsis" value="Help ET go home" />
</bean>
要使此功能“开箱即用”,Spring要求代码必须在启用调试标志的情况下进行编译(对于所有调试信息,均使用-g表示,或者-g:vars表示为精确值) ,以获取局部变量调试信息)。这样,Spring可以在调试信息中查找参数名称。但是,由于此信息未在JVM中缓存,因此必须从磁盘上加载它,这会大大增加I / O时间。
要解决此问题,您可以使用以下准则之一:
- 使用@ConstructorProperties批注显式命名您的构造函数参数,如下所示。
public class Movie {
// Fields omitted
@ConstructorProperties({"name", "synopsis"})
public Movie(String name, String synopsis) {
this.name = name;
this.synopsis = synopsis;
}
}
- 在不使用构造函数注入的情况下按名称定义Bean:
<bean id="movie" class="example.Movie">
<constructor-arg index=0 value="ET" />
<constructor-arg index=1 value="Help ET go home" />
</bean>