Подтвердить что ты не робот

Spring пример внедрения интерфейса

Никто пока не смог обеспечить корректный пример внедрения интерфейса в Spring Framework. Статья Мартина Фаулера не для смертных, а всего лишь слова, расположенные в очень запутанном виде. Я просмотрел THIRTY-статьи, в которых люди либо говорят: "Spring не поддерживает напрямую для инъекций интерфейса" ( "а потому, что я точно не знаю, как я буду описывать только инъекции установщика и конструктора" ), либо "Я обсужу это в моих других потоках" или либо будет немного комментариев ниже, говоря, что это неправильный пример. Я не прошу объяснений, например BEG.

Существует три типа инъекций: конструктор, сеттер и интерфейс. Spring не поддерживает последние непосредственно (как я заметил, люди говорят). Итак, как это делается точно?

Спасибо,

4b9b3361

Ответ 1

Согласно Варианты DI в spring

DI существует в двух основных вариантах: инъекции зависимостей на основе конструктора и инъекции зависимостей на основе Setter.

Также см. Включение интерфейса в spring явно не указано.

Таким образом, существует только два варианта DI. Поэтому, если в документации ничего не сказано о введении интерфейса, ясно, что ее нет. Те, кто считает, что инъекция интерфейса выполняется путем предоставления метода setter в интерфейсе, ответьте мне:

  • Почему spring ref doc оставили упоминание о вводе интерфейса?
  • Почему не удается ввести интерфейс через метод setter NOT, который рассматривается как сама инъекция setter. Зачем создавать специальный термин для этого, когда введение интерфейса ничего не влияет, я имею в виду, что он все еще настроен таким же образом. Если бы они были разными, то как можно найти его, увидев конфигурацию. Не должно ли быть прозрачным, что в config и не видя им, что фактически настроенный класс реализует какой-то интерфейс?
  • Точно так же, как Активация с использованием метода экземпляра factory и Активация с использованием статический метод factory, некоторые атрибуты bean должны прояснить инъекцию интерфейса?

Ответ 2

При вставке интерфейса интерфейс явно определяет точку, в которой может быть установлена ​​зависимость:

interface InjectPerson {
    public void injectHere(Person p);
}

class Company implements InjectPerson {
   Person injectedPerson; 

   public void injectHere(Person p) {
        this.injectedPerson = p;
    }
}

Ответ 3

Привет, я пробовал с очень простым подходом, который может прояснить ваш ответ.

Ниже приведен код, который я построил с использованием двух интерфейсов и двух классов bean.

первый интерфейс с именем Job.

public interface Job {
    public void setmyJob(String myJob);
    public String getmyJob();
}

и один класс для реализации этого интерфейса с именем MyJob

public class MyJob implements Job {
    public String myJob;

    public MyJob() {
        System.out.println("From MyJob default Constructor and the ID= "+this);
    }

    public void setmyJob(String myJob) {
        this.myJob=myJob;
    }

    public String getmyJob() {
        return myJob;
    }
}

На следующем шаге я создал другой интерфейс с именем Service

public interface Service {
    public void setJob(Job job);
    public Job getJob();
}

а затем снова другой класс для реализации этого сервисного интерфейса.

public class MyService implements Service {

    public Job job;

    public void setJob(Job job) {
        this.job=job;
        System.out.println("Hello from Myservice: Job ID="+job);
    }

    public Job getJob() {
        return job;
    }
}

то я создал основной класс с основной функцией и записал код следующим образом:

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApplication {

    public static void main(String...a) {

        BeanFactory beanfactory=new ClassPathXmlApplicationContext("Beans.xml");

        MyService myservice=(MyService)beanfactory.getBean("myservice");
        System.out.println("Before print");
        System.out.println(myservice.getJob().getmyJob());
    }
}

в моем файле Beans.xml я упомянул код следующим образом и он работал.

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <bean id="myjob" class="MyJob">
        <property name="myJob" value="My First String"/>
    </bean>

    <bean id="myservice" class="MyService">
        <property name="job" ref="myjob"/>
    </bean>
</beans>

Я также добавил к другим онлайн-учебникам, а затем получил такое решение. сообщите мне, если у вас есть какие-либо проблемы с этим кодом. он работает для меня.

Ответ 4

Я думаю, что кто-то ответил на ваши вопросы здесь Я также не знал, что такое инъекция интерфейса, пока я не прочитаю этот оператор из "Pro Spring MVC с помощью веб-книги потока"

"Обратите внимание, что инжекция зависимостей на основе интерфейса не поддерживается платформой Spring. означает, что нам нужно указать, какую конкретную реализацию нужно вводить для определенного интерфейса ".

Ответ 5

Существует 3 типа инъекций зависимостей: -

1. Constructor Injection(E.g Pico Container, Spring supports it).
2. Setter Injection(E.g Spring supports it).
3. Interface Injection(E.g Avalon, Spring does not support it).

Spring поддерживает только инсталляцию на основе конструктора и сеттера. Похоже, вы запутались в разных типах (3) и что поддерживает spring (2 из них).

Ответ 6

Пожалуйста, проверьте приведенный ниже пример для инъекции iterface.

Существует интерфейс формы и 2 конкретных класса, которые образуют формы, а именно квадрат и прямоугольник.

Интерфейс

package di.interfaceinjection;
public interface Shape {
    public String shapeName();
    public void displayName();
}

2 Реализованные классы

package di.interfaceinjection;

public class Square implements Shape {

    @Override
    public String shapeName() {
        return "Square";
    }

    @Override
    public void displayName() {
        System.out.println("Square");       
    }

}

package di.interfaceinjection;

public class Rectangle implements Shape{

    @Override
    public String shapeName() {
        return "Rectangle";
    }

    @Override
    public void displayName() {
        System.out.println("Rectangle");        
    }

}

Теперь у нас есть класс, который устанавливает форму.

public class ShapeSetter {

    private Shape shape;

    public Shape getShape() {
        return shape;
    }

    public void setShape(Shape shape) {
        this.shape = shape;
    }

}

и, наконец, конфигурация

<bean id="shape1" class="di.interfaceinjection.ShapeSetter">
    <property name="shape" ref="square"></property>
   </bean>
    <bean id="shape2" class="di.interfaceinjection.ShapeSetter">
    <property name="shape" ref="rectangle"></property>
   </bean>
   <bean id="square" class="di.interfaceinjection.Square"></bean>
   <bean id="rectangle" class="di.interfaceinjection.Rectangle"></bean>

Здесь

мы впрыскиваем разные формы.

package di.interfaceinjection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InterfaceInjeection {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ApplicationContext appContext  = new ClassPathXmlApplicationContext("intro.xml");
        ShapeSetter shape = (ShapeSetter)appContext.getBean("shape2");
        shape.getShape().displayName();
    }

}

Ответ 7

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

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

Я также могу предложить еще один запоминающийся пример:

package creditCards;

interface PaymentCard {
    Boolean isDebitAllowed();
}

   <bean id="card" class="creditCards.PaymentCard">
      <lookup-method name="isDebitAllowed" bean="boolValue"/>
    </bean>

    <bean id="boolValue" class="java.lang.Boolean">
        <constructor-arg type="boolean" value="true"/>
    </bean>

Как вы видите здесь, возможно даже создать bean интерфейс! Тем не менее, это не инъекция интерфейса, так как IoC contener инициализирует установку этого bean по своему усмотрению. Другими словами, card bean - это инициализированный объект, а не интерфейс, что делает правильный ответ на этот вопрос правильным.