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

时间:2019-07-03 16:25:49

标签: java spring interface

我是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;
    }
}

Restcontroller类,将bean注入到其中:

@RestController
public class Login {

    @Autowired
    ILoginServicio iLoginServicio;

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

1 个答案:

答案 0 :(得分:1)

它是Liskov substitution principle。根本原因是它将为您提供灵活性。

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

另一个非Spring示例。假设您有一个如下列表。仅使用实现会限制您。怎么样?例如,如果您确定enableUBSanitizer = "NO"的运行状况不佳并想使用ArrayList,则必须更改所有变量的数据类型,并解决LinkedList中存在的方法之类的问题而不是在ArrayList中。如您所见,在大型代码库中,它需要很多时间。

LinkedList

但是,使用ArrayList<String> data = new ArrayList<>(); 界面,可以确保不会发生方法存在问题或其他数据类型问题,因为所有实现都必须具有必需的方法。

List