我是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){
//.......
}
}
答案 0 :(得分:1)
它是Liskov substitution principle。根本原因是它将为您提供灵活性。
假设您当前使用MySQL数据库。但是,两年后,您想迁移到MongoDB。您的应用程序逻辑将保持不变。它的流程仍然相同,但是数据库供应商将有所不同。如果要使用实现,则必须用新的实现替换所有当前的类变量。但是,使用接口时,只需使用相同的方法签名实现一个新接口,并将Spring配置为使用新接口,而不是旧接口。
另一个非Spring示例。假设您有一个如下列表。仅使用实现会限制您。怎么样?例如,如果您确定enableUBSanitizer = "NO"
的运行状况不佳并想使用ArrayList
,则必须更改所有变量的数据类型,并解决LinkedList
中存在的方法之类的问题而不是在ArrayList
中。如您所见,在大型代码库中,它需要很多时间。
LinkedList
但是,使用ArrayList<String> data = new ArrayList<>();
界面,可以确保不会发生方法存在问题或其他数据类型问题,因为所有实现都必须具有必需的方法。
List