【问题标题】:DAO class declared in ApplicationContext (Spring)在 ApplicationContext (Spring) 中声明的 DAO 类
【发布时间】:2011-10-10 21:31:59
【问题描述】:

我一直在研究我所在公司的一些现有代码,我看到的是 applicationContext.xml 文件将 UserDAO 类声明为一个 bean,这很好,但在 DAO 类本身中 getFromApplicationContext(ApplicationContext ctx) 已被声明它返回 DAO 类本身的实例。我无法理解这个方法在哪里被调用,谁在调用它。 DAO 类正在扩展 HibernateDaoSupport 类 我怎么知道我必须在我的类中创建这个方法,因为如果我删除它,eclipse 中的编译器不会抱怨。我想说的是应该有一个接口或抽象类来强迫我写这个方法。

public static UserDAO getFromApplicationContext(ApplicationContext ctx) {
    return (UserDAO) ctx.getBean("userDAO");
}

请任何能解释一下的人。

【问题讨论】:

    标签: java eclipse spring dao


    【解决方案1】:

    通常,您不应该引用应用程序上下文,尤其是在像用户 dao 这样微不足道的事情中。

    查找用法的一些提示:

    • 使用eclipse“调用层次结构”(CTRL + ALT + H)查看调用的方法在哪里
    • 使用右键->引用->项目查看类的使用位置

    如果没用过,也没有编译问题,xml配置也没有什么特别的地方(比如factory-method) - 删除吧。

    【讨论】:

    • 使用 CTRL+ALT+H 我发现来自 org.springframework.beans.factory.BeanFactory 的 getBean(String) 正在调用此方法。但为什么它仍然是一个谜。因为 GlobalDataAceess 类正在使用注入到其中的 UserDAO bean。 GlobalDataAccess 类也在 applicationContext 中声明为 bean,在 Controller 中,我们调用 GlobalDataAccess 来获取我们在其上调用方法的 DAO。那么 Beanactory 通过调用这个神秘方法在哪里发挥作用。
    • DAO 是否实现了某些接口?
    • 我真的不明白Spring的getBean方法怎么能调用这个方法,尤其是不使用反射的情况下。我怀疑 Spring 是否将您的 UserDAO 类作为依赖项。
    【解决方案2】:

    如果这个方法没有在任何地方使用,我想你可以放心地删除它。它看起来不像是 Spring 自动调用的某个方法。相反,它看起来像是从应用程序上下文中获取 UserDAO 实例的实用方法。

    这个方法很有用,因为它避免了到处硬编码 bean 的名称,但通常应该避免,因为 Spring 的全部意义在于使用依赖注入,从而避免像这样的 bean 查找。应用程序上下文可用于在启动时获取一些根对象。但是应该注入所有其他 bean。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多