避免同时使用构造函数和字段注入的最佳选择是什么?
据我所知,不推荐使用字段注入,而构造函数才是最好的方法。
请在下面查找在@Configuration
bean中创建类A和在类A中创建类B作为构造函数参数的地方。
然而,类A也需要其他bean来操作,比如C/D/E,它们有自己的自动连接依赖项。我不知道如何在这里应用最佳推荐方法。
有什么建议,请告诉我。
@Configuration
class Config {
@Bean
public A create_A() {
A = new A(new B());
}
}
class A {
B b;
@Autowired
C c;
@Autowired
D d;
@Autowired
E e;
A(B b) {
this. b = b;
}
}
class C {
@Autowired
Y y;
}
3条答案
按热度按时间anhgbhbe1#
一般来说,
@Autowired
注解已经出现在Spring 2.5中,后来在Spring 3.0中,他们引入了“Java DSL”用于配置,即使用@Configuration
注解和@Bean
注解方法进行配置的方式。如果像在类A的示例中那样使用
@Configuration
,那么实际上不必使用@Autowired
,如果通过@Configuration
管理所有内容,也不需要像@Component
这样的注解。因此,假设您不确定如何将
B
或C
之类的类注入到A
类中而不进行自动连接,假设类A
是通过@Configuration
定义的,您可以执行以下操作:另一种方法是在
@Configuration
中使用显式方法调用:但是,如果
B
和/或C
是在不同的@Configuration
文件中定义的或通过@Component
注解定义的,则此方法将不起作用注意,类
A
没有任何Autowired字段,所有内容都是通过构造函数注入的。基本上,类A
现在根本没有任何与spring相关的注解。现在,例如,如果您不使用
B
和C
的配置,您仍然可以将@Component
放在它们上面,并且这仍然有效,因为Spring“收集”关于应该创建什么bean的信息,并且它有多个资源来“获得”这种信息:通过用@Component
注解的类的类扫描、通过配置中定义的@Bean
-s等等。即使你不管理类
A
,构造函数注入仍然可以工作:voase2hg2#
@Bernd确实回答了这个问题,但我认为应该包含一些代码以使其更清楚
gzszwxb43#
你的例子有点难以理解,因为它缺少上下文。
总体来说:字段注入在存储库、服务或控制器等Singelton组件上是坏的。
不知何故,你的例子有点难以效仿,但有一个模式对我很有效:
所以你必须照顾好那些字段,甚至编译器也会告诉你是否出了问题...