当前位置: 首页 > 知识库问答 >
问题:

spring@autowire论属性与构造函数

陈业
2023-03-14

因此,由于我一直在使用spring,如果我要编写一个具有依赖项的服务,我将执行以下操作:

@Component
public class SomeService {
     @Autowired private SomeOtherService someOtherService;
}

我现在运行了使用另一个约定来实现相同目标的代码

@Component
public class SomeService {
    private final SomeOtherService someOtherService;

    @Autowired
    public SomeService(SomeOtherService someOtherService){
        this.someOtherService = someOtherService;
    }
}

这两种方法都会奏效,我明白。但是使用选项B有什么好处吗?对我来说,它在类和单元测试中创建了更多的代码。(必须编写构造函数,不能使用@InjectMocks)

是不是我漏了什么?autowired构造函数除了向单元测试添加代码之外,还有其他的功能吗?这是一种更好的方式来进行依赖注入吗?

共有2个答案

弓宏茂
2023-03-14

我就用简单的文字给大家解释一下:

在选项(A)中,您允许任何人(在spring容器外部/内部的不同类中)使用默认构造函数(如new SomeService())创建实例,这并不好,因为您需要为SomeService创建SomeService对象(作为依赖项)。

autowired构造函数除了向单元测试添加代码之外,还有其他的功能吗?这是一种更好的方式来进行依赖注入吗?

选项(B)是首选方法,因为它不允许创建someService对象而不实际解析someOtherService依赖项。

方风华
2023-03-14

是的,选项B(被称为构造函数注入)其实比字段注入更推荐,有几个优点:

  • 可以清楚地识别依赖关系。在任何其他情况下(比如在配置类中显式创建bean实例)测试或实例化对象时,都不能忘记一个
  • 依赖关系可以是最终的,这有助于增强健壮性和线程安全性
  • 您不需要反射来设置依赖项。InjectMocks仍然可用,但不是必需的。您可以自己创建mock,并通过调用构造函数来注入mock

更详细的文章请看这篇博客文章,作者是《spring》的撰稿人之一Olivier Gierke。

 类似资料:
  • 问题内容: 因此,由于我一直在使用Spring,所以如果我要编写一个具有依赖项的服务,我将执行以下操作: 我现在遇到了使用另一种约定实现相同目标的代码 我知道这两种方法都行得通。但是使用选项B有一些好处吗?对我来说,它在类和单元测试中创建了更多代码。(必须编写构造函数,而不能使用@InjectMocks) 有什么我想念的吗?除了将代码添加到单元测试中之外,自动装配构造函数还有其他功能吗?这是进行依

  • 我想用构造函数注入将一个bean列表注入到一个spring bean中。 但是BeanToInject的实现在其他模块中。这些模块可能被关闭。如果applicationcontext中没有BeanToInject的实现,则spring在start上抛出异常,而不是注入空列表。我能做什么?(对我来说,基于设置器和私有财产的自动取舍不是一种选择。)

  • 我有2个服务类,所以在控制器类2@Autowired构造器中,我运行以下异常: 严重:向类[org.springframework.web.context.ContextLoaderListener]org的侦听器实例发送上下文初始化事件时出现异常。springframework。豆。工厂BeanCreationException:autowire标记的构造函数无效:public com。Spri

  • 我正在尝试从我的主方法创建一个Spring bean。 我已将此bean配置为具有特定属性。这些值是在由@Configuration注释的SpringConfig类中指定的。 bean是使用Spring Application Context在我的main()方法中创建的。bean成功启动,但它没有我在SpringConfig类中指定的属性。我不明白为什么? 我可能已经确定了问题的原因:这个bea

  • 我正在尝试使用https://docs.oracle.com/javase/7/docs/api/javax/swing/text/SimpleAttributeSet.html 建造商: 基于提供的属性集创建新属性集。 所以我需要构建一个属性集来放入构造函数。看看javadochttps://docs.oracle.com/javase/7/docs/api/javax/swing/text/A

  • 题目说明了一切,我得到了一个类,其中构造函数的变量必须是私有的。 当然,它附带了变量的公共。 现在问题就在我尝试制作一个名为 Magazine 的子类之后。该类应继承名称和价格,但对于每个对象启动,价格都是恒定的。所以它们不会作为名称出现在构造函数上。 这也带有它自己的。 我试图将价格放在构造函数中,但构造函数需要一个传递的参数。使用还会通知父构造函数中没有一个具有这样的形状。 当我尝试使用父类方