gpt4 book ai didi

java - spring @Autowire 属性与 setter

转载 作者:IT老高 更新时间:2023-10-28 13:46:02 26 4
gpt4 key购买 nike

将@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();
}
}

最佳答案

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

在这些情况下, setter (或构造器) Autowiring 会更适合您
您不会有未使用的类级字段。

具体例子:
您需要构造 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-

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

Class MyClass {
private RabbitTemplate template;

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

...比直接 Autowiring ConnectionFactory 字段更好。

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

关于java - spring @Autowire 属性与 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com