弹簧@Autowire属性 vs 设置器

2022-08-31 20:16:31

将@Autowired附加到属性或在 setter 中进行注释之间有什么区别?

据我所知,它们都有相同的结果,但是有什么理由使用一个而不是另一个吗?

更新(更简洁)

这两者之间有区别吗?

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;

public class TextEditor {
   private SpellChecker spellChecker;

   @Autowired
   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }

   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

和这个

package com.tutorialspoint;

import org.springframework.beans.factory.annotation.Autowired;

public class TextEditor {
   @Autowired
   private SpellChecker spellChecker;

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

   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

答案 1

有时需要类 A 的实例,但不在类的字段中存储 A
您只需要一个实例来执行一次性操作。或者,您使用 A 实例获取 B 的实例,并且将 B 存储在字段中。

在这些情况下,setter(或构造函数)自动布线将更适合您
您将没有未使用的类级字段。

具体示例:
您需要构造RabbitTemplate(向RabbitMQ发送消息的对象)要构造它,您需要ConnectionFactory
http://docs.spring.io/spring-amqp/docs/latest_ga/api/org/springframework/amqp/rabbit/core/RabbitTemplate.html#RabbitTemplate-org.springframework.amqp.rabbit.connection.ConnectionFactory-

您不需要存储该连接工厂。在这种情况下,代码如下所示:

Class MyClass {
private RabbitTemplate template;

@Autowired 
void setConnectionFactory(ConnectionFactory c) {
    template=new RabbitTemplate(c);
}
}

...将比直接自动布线连接网站字段更好地为您服务。

在此示例中,构造函数级别的自动布线会更好,因为您的对象将始终是完全构造的。很明显,ConnectionFactory是一个强制性的依赖关系,而不是一个可选的依赖关系。


答案 2

使用注释,您不需要 setter 方法。一旦您的bean的构造函数完成了分配/创建对象,Spring将扫描此注释并注入您注释的对象实例。@Autowired

而如果你有 setter 并且你仍在使用 xml config,你将显式设置属性。

话虽如此,您可以使用自动连接的注释来注释您的构造函数和setter方法,我更喜欢,因为这会给我以后离开Spring的灵活性(尽管我不会这样做)。


推荐