我以前在我的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的组合。这种方法有什么缺点吗?我是以错误的方式解决这个问题吗?
答案 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的局限性。