当我们将一个类注释为@Autowired
时,它必须是一个接口还是可以是一个类?
我见过的所有使用 Spring 的例子,都是使用一个接口,然后在一个类上实现它。然后使用接口类型调用具体类上的函数。我们能不能简单地添加@Autowired
到一个具体的类而不是一个接口。
我知道程序与 JAVA 中的接口类比,但如果你不依赖于多态,那为什么要编写接口?
当我们将一个类注释为@Autowired
时,它必须是一个接口还是可以是一个类?
我见过的所有使用 Spring 的例子,都是使用一个接口,然后在一个类上实现它。然后使用接口类型调用具体类上的函数。我们能不能简单地添加@Autowired
到一个具体的类而不是一个接口。
我知道程序与 JAVA 中的接口类比,但如果你不依赖于多态,那为什么要编写接口?
不,您不必使用接口,就 Spring 而言,这完全没问题:
@Service
public class FooService {
@Autowired
private FooDao fooDao;
}
或者你甚至可以进行建筑注入:
@Service
public class FooService {
private final FooDao fooDao;
public FooService(FooDao fooDao) {
this.fooDao = fooDao;
}
}
接口通常是不合时宜的实践,每一代都在重复。如果不需要,请不要使用它们。如果它们总是只有一个实现,或者如果你想模拟这样一个类(现代模拟框架模拟类没有任何问题),它们就不是必需的。
注入具体类也没有错,就像FooDao
上面的例子一样。它有一些技术含义。代理,但没有什么是不能理解的。
技术上@Autowired
可用于实现或接口。春天不在乎。注入接口是一种设计策略。
@Autowired 也可以用于类而不是接口。但是,使用接口将是一种更好的做法,因为它减少了组件之间的硬耦合。