Java 如何防止使用@autowired
我了解到自动连接bean实际上不是一个好的实践。spring文档中也提到了这一点。我知道有两种类型的bean配置。一个是通过XML配置,另一个是通过java配置类。如果我们想使用代码来进行bean配置,而不使用@autowired,我们该如何做呢?似乎如果使用代码,我们仍然需要@autowired来注入bean e、 g.在下面的例子中,如果我们不想使用@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
@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放入构造函数中,这使得测试更容易。