Вот список примеров кода:
База
@Validated
@Component
public class MyImpl1 {}
@Validated
@Component
public class MyImpl2 {}
@Service
public MySelector {
private final MyImpl1 myImpl1;
private final MyImpl2 myImpl2;
@Autowired
public MySelector(MyImpl1 myImpl1, MyImpl2 myImpl2) {
this.myImpl1 = myImpl1;
this.myImpl2 = myImpl2;
}
public Object select (Long id) {
switch (id) {
case 1:
return myImpl1;
case 2:
return myImpl1;
}
}
}
Это работает : бобы вводятся, здесь нет проблем. Важное замечание: MyImpl
bean - это прокси , а нет
проблема для автопроводки.
Но все становится иначе, когда я добавляю implements
вот так:
реализует
@Validated
@Component
public class MyImpl1 implements MyInterface{}
@Validated
@Component
public class MyImpl2 implements MyInterface{}
public interface MyInterface {}
@Service
public MySelector {
private final MyImpl1 myImpl1;
private final MyImpl2 myImpl2;
@Autowired
public MySelector(MyImpl1 myImpl1, MyImpl2 myImpl2) {
this.myImpl1 = myImpl1;
this.myImpl2 = myImpl2;
}
public Object select (Long id) {
switch (id) {
case 1:
return myImpl1;
case 2:
return myImpl2;
}
}
}
Вот и я получил:
Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myImpl1' is expected to be of type 'MyImpl1' but was actually of type 'com.sun.proxy.$Proxy108'
Если я уберу @Validated
канун
Попробуй снова работать.
Я понимаю, что Spring использует проксирование, и лучше использовать интерфейсы. Но я не могу понять, почему у меня здесь проблемы?
Если spring может автоматически подключать прокси-сервер по имени класса, почему он не может сделать это, когда добавлено implements
, особенно если этот интерфейс не используется в полях автоматического подключения.
ОБНОВЛЕНО
Spring-boot версия - 2.0.3
версия с пружинным сердечником 5.0.7.RELEASE