3

当我们将一个类注释为@Autowired时,它必须是一个接口还是可以是一个类?

我见过的所有使用 Spring 的例子,都是使用一个接口,然后在一个类上实现它。然后使用接口类型调用具体类上的函数。我们能不能简单地添加@Autowired到一个具体的类而不是一个接口。

我知道程序与 JAVA 中的接口类比,但如果你不依赖于多态,那为什么要编写接口?

4

3 回答 3

4

不,您不必使用接口,就 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上面的例子一样。它有一些技术含义。代理,但没有什么是不能理解的。

于 2012-10-29T15:28:59.617 回答
3

技术上@Autowired可用于实现或接口。春天不在乎。注入接口是一种设计策略。

于 2012-10-29T15:30:10.333 回答
2

@Autowired 也可以用于类而不是接口。但是,使用接口将是一种更好的做法,因为它减少了组件之间的硬耦合。

于 2012-10-30T06:03:35.780 回答