【问题标题】:Spring Autowired Class弹簧自动装配类
【发布时间】:2012-10-18 22:37:22
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-08
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 2013-08-23
          • 2019-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多