Spring Autowired Class

时间:2012-10-29 15:26:11

标签: java spring dependency-injection inversion-of-control

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

使用Spring的所有示例我已经看过,使用接口然后在类上实现它。然后使用接口类型调用Concrete类上的函数。我们不能简单地将@Autowired添加到具体类而不是接口。

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

3 个答案:

答案 0 :(得分: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。它有一些技术含义。代理,但没有什么是无法理解的。

答案 1 :(得分:3)

技术上@Autowired可用于实现或接口。春天不关心它。注入界面是一种设计策略。

答案 2 :(得分:2)

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