Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止使用@autowired_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何防止使用@autowired

Java 如何防止使用@autowired,java,spring,spring-boot,Java,Spring,Spring Boot,我了解到自动连接bean实际上不是一个好的实践。spring文档中也提到了这一点。我知道有两种类型的bean配置。一个是通过XML配置,另一个是通过java配置类。如果我们想使用代码来进行bean配置,而不使用@autowired,我们该如何做呢?似乎如果使用代码,我们仍然需要@autowired来注入bean e、 g.在下面的例子中,如果我们不想使用@Autowired,我们该怎么做?最佳实践应该是什么 @Service public class ClassA { private Cla

我了解到自动连接bean实际上不是一个好的实践。spring文档中也提到了这一点。我知道有两种类型的bean配置。一个是通过XML配置,另一个是通过java配置类。如果我们想使用代码来进行bean配置,而不使用@autowired,我们该如何做呢?似乎如果使用代码,我们仍然需要@autowired来注入bean

e、 g.在下面的例子中,如果我们不想使用@Autowired,我们该怎么做?最佳实践应该是什么

@Service
public class ClassA {
  private ClassB classB;

  @Autowired
  public ClassA(ClassB classB) {
    this.classB = classB;
  }
}

一种选择是使用@Configuration类和其中的@Bean方法。 像这样的

@Configuration 
public MyConfigClass {

    @Bean
    ClassB makeClassB(){
        return new ClassB();
    }

    @Bean
    ClassA makeClassA(final ClassB classB){
        return new ClassA(classB);
    }
}

请注意,如果@Component类只有一个构造函数,那么默认情况下,它会用@Autowired注释。这可能有助于解释为什么它有时似乎有效,但你看不到任何注射

你从哪里读到自动布线是一种不好的做法? Autowiring是自动依赖项注入——Spring的核心功能

我想您已经读过这样的字段注入是一种糟糕的做法,因为它使模拟测试的依赖性变得不可能:

@Service
public class ClassA {
  @Autowired
  private ClassB classB;

}

在较新的Spring版本中,如果类只有一个构造函数,则可以省略构造函数上的@Autowired注释。

如果可能,最好使用构造函数依赖项注入,因为构造函数注入会阻止循环依赖项

@Service
// @RequiredArgsConstructor // if using lombok
public class ClassA {
     private ClassB classB;

     // If not using lombok
     public ClassA(ClassB classB) {
          this.classB = classB;
     }
}

然而,setter注入也可以工作。查看更多答案。

您只需从构造函数中删除
@Autowired
注释,它仍然可以工作(如果您没有使用真正旧版本的Spring)。这基本上与构造函数的依赖项注入完全相同-Spring为方法
makeClassA
提供了
ClassB
的实例。我喜欢这样做,然后在测试中使用
ReflectionTestUtils
模拟那些自动连接的属性。对我来说,它使代码更具可读性。当您决定不再使用Spring或使用不同的依赖注入框架时,您的代码将变得毫无用处。如果遵循常见的最佳实践模式,则不需要使用对存根依赖项的反射。我建议你重新评估一下你是如何做事的。使用Mockito进行存根同样简单。@Paplusc如果你想写得尽可能少,你可以看看Lombok和
@RequiredArgsConstructor
,作为补充。我从Pro Spring 5一书中读到,在许多情况下使用自动布线会导致不良做法,在大型应用程序中是不灵活的。然而,在现实生活中,在大多数情况下,我看到了通过setter或构造函数注入使用自动连接,而且我从未见过任何使用纯xmlbean配置构建的实际应用程序。因此,在阅读了相关内容后,我对它的使用感到困惑。是的,这些天我只是试图避免使用字段依赖注入,并将DI放入构造函数中,这使得测试更容易。