使用Google App Engine的Spring框架支持

时间:2010-06-18 04:17:36

标签: google-app-engine spring

Google App Engine是否支持Spring框架?

3 个答案:

答案 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验证:

     
      
  1. 创建一个扩展XmlWebApplicationContext的类。
  2.   
  3. 覆盖 initBeanDefinitionReader方法。
  4.   
  5. 将XmlBeanDefinitionReader验证模式设置为VALIDATION_NONE。如果App Engine应用程序在App Engine SDK中运行,则启用XML验证;在生产模式下运行时,则禁用XML验证。
  6.   
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);
                   }
               }
}
  
      
  1. 打开web.xml文件。
  2.   
  3. 创建一个部分。
  4.   
  5. 添加一个值为contextClass的元素。
  6.   
  7. 添加一个元素,其值指向您之前创建的类。
  8.   
<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时间

     

要解决此问题,您可以使用以下准则之一:

     
      
  1. 使用@ConstructorProperties批注显式命名您的构造函数参数,如下所示。
  2.   
public class Movie {
    // Fields omitted
    @ConstructorProperties({"name", "synopsis"})
    public Movie(String name, String synopsis) {
        this.name = name;
        this.synopsis = synopsis;
    }
}
  
      
  1. 在不使用构造函数注入的情况下按名称定义Bean:
  2.   
<bean id="movie" class="example.Movie">
    <constructor-arg index=0 value="ET" />
    <constructor-arg index=1 value="Help ET go home" />
</bean>