【问题标题】:What is the use of ref in constructor-arg in java spring beans?java spring bean的constructor-arg中的ref有什么用?
【发布时间】:2015-11-26 11:37:06
【问题描述】:

我是 Spring bean 的新手,所以我没有在 constructor-arg 中使用 ref。为什么不像这里的例子一样再次使用 value,

这是 TextEditor.java 文件的内容:

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;

   public TextEditor(SpellChecker spellChecker) {
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

下面是另一个依赖类文件SpellChecker.java的内容:

package com.tutorialspoint;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }

   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   }

}

以下是 MainApp.java 文件的内容:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      TextEditor te = (TextEditor) context.getBean("textEditor");

      te.spellCheck();
   }
}

以下是配置文件 Beans.xml,其中包含基于构造函数的注入的配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
      <constructor-arg ref="spellChecker"/>
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
   </bean>

</beans>

在这里,为什么不这样做,而不是创建一个 bean textEditor 并引用另一个对象 spellChecker,您可以直接使用 spellChecker bean?

在 MainApp.java 中

TextEditor te = (TextEditor) context.getBean("spellChecker");

如果我们使用它是因为两个对象都在不同的类中,那么如果两个对象都在同一个类中,我们可以取消 ref 吗?

此外,如果多个对象引用同一个对象,是否有必要为每个类创建一个 bean 并使用 ref 来引用该对象或使用同一个 bean 但 scope=prototype?

【问题讨论】:

  • 您的意思是SpellChecker sc = (SpellChecker) context.getBean("spellChecker"); 而不是TextEditor te = (TextEditor) context.getBean("spellChecker");?在您的示例中,除了delegate SpellChecker 的任务之外,TextEditor 并没有做太多事情。但是,在实际应用中,职责会更多。

标签: java spring spring-mvc constructor-injection


【解决方案1】:

Spring bean 的ref 属性引用了另一个在某处实例化的 Spring bean。在您的情况下,SpellChecker 是一个 Spring-singleton bean,您希望将其“注入”到另一个 TextEditor 类型的 Spring bean。 ref 有用的原因是您的大多数 bean 都将是单例的,除非您希望它们按请求、每个会话等创建,默认范围是单例。

另外,如果多个对象引用同一个对象,是否有必要 为这些类中的每一个创建一个 bean 并使用 ref 来引用它 对象或使用相同的bean,但范围=原型?

我认为您想说“多个类引用同一个对象”。在这种情况下,您在类中所做的就是声明对该 bean(或对象)的“引用”。然后你将该 bean “注入”到依赖的类(或 bean)中。

你可以阅读更多关于Spring bean references.

【讨论】:

    【解决方案2】:

    另外,如果多个对象引用同一个对象,是否有必要为每个类创建一个 bean 并使用 ref 来引用这个对象或使用同一个 bean 但范围=原型?

    如果多个类引用同一个对象,您可以使用单例范围(如果您没有在 bean 中指定范围属性,则默认)。在单例中,多个对象共享单例对象。它们只创建对单例对象的本地引用。他们不会每次都初始化一个新对象。因此,使用的堆内存并不多。

    然而,在原型中,每个对象都会创建一个新的内部对象(即在本地初始化一个新的对象引用)。因此,创建许多对象会产生开销,因此会加载堆。

    这完全取决于您要使用哪个范围的应用程序。但通常,在 Web 应用程序中,人们将 Singleton 用于 DAO Connection 类,以便连接过程只发生一次,并被所有引用 DAOConnection 类的类重用。

    他们使用 POJO 类的原型。这样每次类引用它时都会创建一个新对象。

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2015-05-16
      • 2011-07-06
      • 2013-06-20
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多