Весна: Почему мы автоматически подключаем интерфейс, а не реализованный класс?

пример

interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b") 
  IA worker;

  worker.someFunction();
}

Может кто-то объяснить это мне.

Как весна знает, какой полиморфный тип использовать.Нужно ли мне@Qualifier или же@Resource?Почему мы автоматически подключаем интерфейс, а не реализованный класс?
 Dave Newton15 окт. 2012 г., 18:03
Вы бы подключились в другой реализации; Я не понимаю вопроса.
 Dave Newton15 окт. 2012 г., 17:55
Вы автоматически подключаете интерфейс, чтобы подключитьразные Реализация - это одна из точек кодирования интерфейса, а не класса.
 avgolubev21 дек. 2018 г., 10:39
Я думаю, что создание интерфейса только для одной реализации - глупая практика, принятая в мире Java. В результате получается много мусорного кода, но все рады, что они следовали правилам SOLID и OOP. Используйте эту шутку и бросьте весну в мусорное ведро истории.
 OhadR24 июн. 2017 г., 17:37
 JLewkovich12 дек. 2016 г., 21:42
Если мы подключаем интерфейс, что произойдет, если в классе Impl есть метод видимости по умолчанию, к которому мне нужен доступ? Я не могу добавить эту заглушку метода в интерфейс, потому что общедоступный интерфейс не может содержать модификатор по умолчанию.

Ответы на вопрос(2)

Решение Вопроса

Пока существует только одна реализация интерфейса и эта реализация аннотируется@Component при включенном сканировании компонентов Spring среда Spring может находить пару (интерфейс, реализация). Если компонентное сканирование не включено, вы должны явно определить компонент в вашем application-config.xml (или эквивалентном файле конфигурации Spring).

Нужен ли мне @Qualifier или @Resource?

Как только у вас будет более одной реализации, вам нужно будет квалифицировать каждую из них, а во время автоматической разводки вам нужно будет использовать@Qualifier аннотация для внедрения правильной реализации, наряду с@Autowired аннотаций. Если вы используете @Resource (семантика J2EE), то вы должны указать имя компонента с помощьюname атрибут этой аннотации.

Почему мы автоматически подключаем интерфейс, а не реализованный класс?

Во-первых, всегда полезно кодировать интерфейсы в целом. Во-вторых, в случае весны вы можете внедрить любую реализацию во время выполнения. Типичным примером использования является внедрение фиктивной реализации на этапе тестирования.

interface IA
{
  public void someFunction();
}


class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

Ваша конфигурация bean-компонента должна выглядеть следующим образом:

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

В качестве альтернативы, если вы включили сканирование компонентов в пакете, в котором они присутствуют, то вы должны квалифицировать каждый класс с помощью@Component следующее:

interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component    
class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

затемworker вMyRunner будет введен с экземпляром типаB.

 Victor Dombrovsky29 сент. 2016 г., 09:30
@ Лаки, я ошибся. я имел в виду@Autowired @Qualifier("a1") A a;
 stackoverflow15 окт. 2012 г., 18:25
Викдор - см. Редактирование. Это правильный способ аннотировать классы и внедренный объект?
 Lucky29 сент. 2016 г., 09:23
@VictorDombrovsky Is@Autowired @Qualifier("a1") a; действует?
 Vikdor15 окт. 2012 г., 18:39
Пожалуйста, смотрите мое обновление.
 Dave Newton15 окт. 2012 г., 18:01
@stackoverflow Редактирование вопроса не имеет никакого смысла, новый код принадлежит ответу. Иначе вопрос не имеет смысла, потому что он бы ответил сам.

Ваш ответ на вопрос