想想这个场景。我有一个组件 @Autowired 另一个组件也 @Autowired 另一个组件。
Animal.java
@Component
public class Animal{
@Autowired
private Dog dog;
...
}
狗.java
@Componet
public class Dog{
@Autowired
private Fight fight;
....
}
Fight.java
@Component
public class Fight{
....
}
假设@Component Animal 的深度是 3。想象一下这个深度是 10。这会不会很糟糕?如何避免这种情况?
没错,但在你的情况下,我认为你需要使用一个接口,然后你可以使用构造函数注入
Fight
对象。
例如:
public interface Animal {
private Fight fight;
}
然后你应该像这样实现每个动物:
public Dog implements Animal {
public Dog() { }
@Autowired
public Dog(Fight fight) {
this.fight = fight;
}
}
public Cat implements Animal {
public Cat() { }
@Autowired
public Cat(Fight fight) {
this.fight = fight;
}
}
您不需要使用明确的
@Autowired
。您可以使用 final
关键字声明该属性。例如:
@Component
public class Animal{
private final Dog dog;
}
没有错。但你最好让动物成为一个接口,然后自动连接其他服务。另请注意,如果您确切定义该组件是什么而不是在@Component 中说,那会更好。例如,如果战斗是一项服务,请使用@Service。