Java Spring中应用程序上下文和Web上下文中的bean是什么?

Java Spring中应用程序上下文和Web上下文中的bean是什么?,java,spring-mvc,classloader,Java,Spring Mvc,Classloader,应用程序上下文和web上下文之间的分离(以及随之而来的类加载器问题)是我经常遇到的问题。我在我的第一个项目中使用Spring,从一个写得不好的基于JSP的webapp迁移到基于Spring的webapp 我只想知道这种配置是否合理: 我使用注释定义了控制器、表单对象等,并在web应用程序上下文中进行了扫描 在最初将DAO(数据访问对象)放在web应用程序上下文中之后,我将它们移动到了应用程序上下文中——这是因为我需要使用它们来获取spring security的用户/密码,这是一个应用程序上下

应用程序上下文web上下文之间的分离(以及随之而来的类加载器问题)是我经常遇到的问题。我在我的第一个项目中使用Spring,从一个写得不好的基于JSP的webapp迁移到基于Spring的webapp

我只想知道这种配置是否合理:

  • 我使用注释定义了控制器、表单对象等,并在web应用程序上下文中进行了扫描
  • 在最初将DAO(数据访问对象)放在web应用程序上下文中之后,我将它们移动到了应用程序上下文中——这是因为我需要使用它们来获取spring security的用户/密码,这是一个应用程序上下文bean
  • 如果在应用程序上下文中定义了Spring安全性(根据文档),则DAO必须与之配合
现在我遇到了类加载器问题,我将一个对象传递给JDO/DataNucleus,它是由web应用程序类加载器创建的,但DAO都是应用程序上下文的一部分,因此该组件有自己的类加载器,无法匹配相同的对象

DAO的简单方法:

@Override
public boolean userExists(String username) {
    Query query = pm.newQuery(User.class);
    query.setFilter( "username == :usernameParam" );
    query.setResult( "count(username)" );
    query.setResultClass(Long.class);
    System.out.println(username);
    Long result = (Long)query.execute(username);

    return (result!=null && result>0);
}
javax.jdo.JDOUserException:查询 将返回单个字段,但它是 不属于与 ResultClass(java.lang.Long):它是 java.lang.Long

我这样问是因为这不是第一个类加载器问题(我恐怕不是最后一个),因为spring现在的配置方式,所以我想知道我是否做得很差


或者可能有一些配置解决了我还不知道的这类类类加载器问题?

类加载器应该与Spring上下文无关。Webapplication上下文是一个spring容器,通常包含控制器和视图解析器。应用程序上下文包含dao。Web应用程序上下文将应用程序上下文作为父对象,因此它可以访问dao和服务bean,反之亦然。但是,这两个上下文都是同一战争的一部分,应该由同一个类加载器加载


看看您的异常,我认为,它似乎与Spring没有任何关系。

您的术语令人困惑。“应用程序上下文”和“web上下文”可以指各种不同的东西,但你使用它们就像它们是指特定的东西一样。感谢skaffman,我要澄清的是,我指的是Spring的应用程序上下文(在Spring mvc术语中,它是一个跨web应用程序上下文,在此上下文中,可以创建跨所有web应用程序访问的bean),以及webappcontext,这是一个上下文,在该上下文中创建特定于单个WebApp的所有bean。我的意思是在Spring术语中使用这些术语。在Ok上还有一个类似的问题,谢谢,我会挖掘更多。有时,听到我在学习新工具时对它们的配置没有完全偏离基准是很有帮助的。有趣的是,我也发布了另一个问题,但这是一个关于持久性的类加载器问题。我认为这将是一个类加载器问题,所以我可能应该检查哪个类加载器启动了这里讨论的两个对象中的每一个。