具有XML性能的Spring MVC注释

时间:2014-04-10 08:56:50

标签: google-app-engine spring-mvc hibernate-annotations spring-annotations

我以前在我的Google Web应用程序项目中使用过Spring MVC和hibernate注释。部署后启动应用程序需要一些时间。

出于这个原因,我只是为控制器切换到基于Spring MVC XML的方法。但是,对于服务和DAO类,@Service@Repository注释保持不变。

在我的Spring XML中,我正如下所示(没有为服务和DAO类定义bean标记):

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<bean class="com.my.controller.UserController">
    <property name="domainManager" ref="domainManager"/>
    <property name="userProfileDao" ref="userProfileDao"/>
</bean>

UserController内,我没有使用任何@autowired注释。我正在使用注释与XML的组合。这种方法有什么缺点吗?我是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

区别在于使用Annotation或XML,它是在自动装配和“手动注入bean”之间。

编辑:@Autowired和XML组件扫描正在做同样的事情。

您可以使用XML和完整的Java @Configuration“手动注入”bean,相当于您的示例:

@Configuration
public class WebAppConfig {

   @Bean
   public UserDao userDao() {
     return new UserDao();
   }

   @Bean
   public UserController userController() {
     UserController ctrl = new  UserController();
     ctrl.setUserDao(userDao());
     return ctrl;
   }

}

问题非常准确,因为App Engine团队本身已经发现App Engine运行时在类路径扫描中很糟糕(Autowiring通过Class查找匹配项)。

如果您正在执行以下操作,则会在实例启动时发生性能损失:

public class UserController {

   @Autowired
   private UserDao userDao;

   // ...
}

观看此视频,尤其是来自Pivotal(Spring框架)贡献者的问题:http://www.youtube.com/watch?v=lFarE1hH0ss

很少有人知道这个问题。使用Spring AOP甚至可以在生产运行时完全崩溃。请参阅:Using Spring AOP on App Engine causes StackOverflowError

关于你对XML的使用,没有“对与错”。我个人不喜欢编写XML,因为我觉得它更容易出错,但有些人喜欢将他们的配置与代码明确区分开来。我仍然在生产中使用自动装配,因为启动时间对我来说不是问题。做你和你的团队感到满意的事情,记住GAE的局限性。