Простой пример
public interface InitCallback {
void init();
class Http implements InitCallback {
void sendData(String url, SuccessCallback success, FailureCallback fail) {
try {
//Делаем реквест
String httpResult = "200";
//Вызываекм коллбек
success.success(httpResult);
} catch (Exception ex) {
//Вызываекм коллбек в случае ошибки
fail.fail("400");
}
}
public void init() {
System.out.println("Вызван init коллбек");
}
interface SuccessCallback {
void success(String result);
}
interface FailureCallback {
void fail(String error);
}
public static void main(String[] args) {
Http http = new Http();
if (http instanceof InitCallback) {
//Если это наш интерфес, то вызываем колбек
http.init();
}
http.sendData("/my/api", new SuccessCallback() {
@Override
public void success(String result) {
System.out.println("Успешный колбек: " + result);
}
}, new FailureCallback() {
@Override
public void fail(String error) {
System.out.println("Колбек вернул ошибку: " + error);
}
});
}
}
}
И по такому же принципу реализуются специальные интерфейсы в спринге. Он смотрит от чего унаследован твой бин и если он знает этот интерфейс, то дергает его.