【问题标题】:Why in Spring the interface is instantiated and not the class that implements it? [duplicate]为什么在 Spring 中实例化的是接口而不是实现它的类? [复制]
【发布时间】:2025-12-16 21:50:01
【问题描述】:

我是 Spring 新手,对它的工作原理有疑问。

为什么在Spring框架中实例化的是接口而不是实现它的类?

我看过几个教程,它们都是一样的,但我不明白为什么

界面:

public interface ILoginServicio {
    public String getLogin(String usuario, String contrasena);
    public boolean getMultiSearchResult(DirContext dirContext, String searchFilter, String searchBase);
    public boolean displayAttribute(String attrName, final Attributes attributes);
}

实现接口的类:

@Service
public class LoginServicioImpl implements ILoginServicio{

    @Autowired
    private Environment environment;

    @Override
    public String getLogin(String usuario, String contrasena) {
        ....
    }

    @Override
    public boolean getMultiSearchResult(DirContext dirContext, String searchFilter, String searchBase) {
        ...
        return flagActiveDirectory;
    }

    @Override
    public boolean displayAttribute(String attrName, Attributes attributes) {
        ....
        return flagActiveDirectory;
    }
}

注入bean的Restcontroller类:

@RestController
public class Login {

    @Autowired
    ILoginServicio iLoginServicio;

    @RequestMapping("/login")
    public Respuesta<String> login(@RequestBody UsuarioLogin user){
        //.......
    }
}

【问题讨论】:

  • “为什么接口在 Spring 框架中被实例化”......这是错误的,我想知道你为什么这么认为?试过你的代码了吗?

标签: java spring interface


【解决方案1】:

它是Liskov substitution principle。基本原因是它会给你灵活性。

假设您当前使用的是 MySQL 数据库。但是,2 年后您想迁移到 MongoDB。您的应用程序的逻辑不会发生变化。它的流程仍然相同,但数据库供应商会有所不同。如果要使用实现,那么您必须用新的实现替换所有当前的类变量。但是,当使用接口时,您只需实现一个具有相同方法签名的新接口,并将 Spring 配置为使用新接口,而不是旧接口。

另一个非 Spring 示例。假设您有一个如下列表。仅使用实现会限制您。如何?例如,如果您认为ArrayList 性能不佳并想使用LinkedList,那么您必须更改所有变量的数据类型,并解决诸如ArrayList 中存在方法而不是LinkedList 中存在的问题.如您所见,在大型代码库中,它需要大量时间。

ArrayList<String> data = new ArrayList<>();

但是,使用List 接口,您可以确保不会发生方法存在问题或其他数据类型问题,因为所有实现都必须具有所需的方法。

List<String> data = new LinkedList<>();

【讨论】:

    最近更新 更多