Exemple d'injection de l'interface à ressort

personne jusqu'à présent n'était en mesure de fournir un exemple de fonctionnement correct de l'injection d'interface dans le cadre à ressort. L'article de Martin Fowler n'est pas pour les mortels, tout le reste n'est que des mots placés d'une manière très confuse. J'ai parcouru plus de trente articles, où les gens disent soit "le ressort ne supporte pas directement l'injection d'interface"("et parce que je ne sais pas exactement comment je vais décrire seulement les injections de setter et de constructeur") ou soit "je vais en discuter dans mes autres fils" ou soit il y aura quelques commentaires ci-dessous disant que c'est un mauvais exemple. Je ne demande pas d'explication, je vous en PRIE, par exemple.

il existe trois types d'injection: le constructeur, le Setter et L'Interface. Le printemps ne supporte pas les dernières nouvelles directement (comme je l'ai observé dire). Alors, comment est-il fait exactement?

Merci,

21
demandé sur Aubergine 2012-04-20 18:16:01

7 réponses

selon variantes de DI au printemps

DI existe en deux variantes principales, L'injection de dépendance basée sur le constructeur et l'injection de dépendance basée sur le Setter.

voir Aussi de l'Interface d'injection n'est pas mis en œuvre au Printemps affirme clairement.

il n'y a donc que deux variantes de DI. Donc si la documentation ne parle pas d'interface l'injection, c'est clair que ce n'est pas là. Ceux qui croient que l'injection d'interface est fait en fournissant la méthode de setter dans l'interface me répondre:

  1. pourquoi spring ref doc a-t-il laissé la mention de l'injection par interface?
  2. Pourquoi cann pas d'interface d'injection par la mise méthode setter PAS considéré comme l'injection par mutateur lui-même. Pourquoi créer un terme spécial pour cela quand l'introduction de l'interface n'affecte rien, je veux dire son toujours configuré de la même façon. S'ils étaient différents, alors comment peut-on le trouver en voyant la configuration. Ne devrait-il pas être transparent que dans config et ne pas voir l'impl qui a configuré la classe implémente une interface ?
  3. comme Instantiation using an instance factory method et Instantiation using an static factory method , certains attributs de bean devraient clarifier l'injection d'interface?
9
répondu nanosoft 2015-07-06 14:07:20

avec injection d'interface une interface définit explicitement le point où une dépendance peut être définie:

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

class Company implements InjectPerson {
   Person injectedPerson; 

   public void injectHere(Person p) {
        this.injectedPerson = p;
    }
}
8
répondu Stefan 2012-04-20 14:37:08

Salut, j'ai essayé avec une approche très simple qui peut clarifier votre réponse.

voici le code sur lequel j'ai construit en utilisant deux interfaces et deux classes bean.

première interface avec le nom Travail.

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

et une classe pour mettre en œuvre cette interface avec le nom comme 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;
    }
}

dans la prochaine étape j'ai créé une autre Interface avec le nom comme Service

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

et puis encore une autre classe pour mettre en œuvre cette Interface de Service.

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;
    }
}

, puis j'ai créé sur la classe principale avec la fonction principale et écrit le code comme suit:

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());
    }
}

dans mes haricots.fichier xml, j'ai mentionné le code comme suit et il a travaillé.

 <?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>

j'ai aussi reffered à un autre tutoriels en ligne et puis obtenu ce genre de solution. s'il vous plaît laissez-moi savoir si vous avez un quelconque problème avec cette code. il est travaillé pour moi.

6
répondu Vinay Pandey 2015-11-27 06:52:06

je pense que quelqu'un a répondu à vos questions ici Je ne savais pas non plus ce qu'était L'injection D'Interface jusqu'à ce que je lise cette déclaration de "Pro Spring MVC with web flow book "

" notez que l'injection de dépendance basée sur l'interface n'est pas supportée par le cadre de ressort. Ce signifie que nous devons spécifier quelle implémentation concrète injecter pour une certaine interface."

1
répondu Adelin 2017-04-12 07:31:25

il y a 3 types d'injections de dépendance: -

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).
Le ressort

ne supporte que l'injection basée sur le constructeur et le setter. On dirait que vous avez été confus dans les différents types(3) et quels supports de ressort (2 d'entre eux).

1
répondu Goyal Vicky 2015-08-11 11:46:42

veuillez cocher l'exemple ci-dessous pour l'injection iterface.

il y a une interface de forme et deux classes de béton qui imiplements forme à savoir carré et rectangle.

l'interface

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

2 classes appliquées

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");        
    }

}

Maintenant, nous avons une classe qui définit la forme.

public class ShapeSetter {

    private Shape shape;

    public Shape getShape() {
        return shape;
    }

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

}

et enfin la configuration

<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>

ici,

nous injectons différentes formes.

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();
    }

}
1
répondu Sivaranjani D 2015-11-15 06:17:57

je pense que la confusion autour de l'injection d'interface est causée par une mauvaise compréhension de ce que le terme" injection d'interface " signifie réellement. Dans ma compréhension, l'injection d'interface décrit la capacité d'un conteneur de haricot d'injecter une nouvelle interface à la fève, peu importe que la définition de classe de cette fève n'est pas mise en œuvre.

tous les exemples présentés ici montrent comment créer un haricot à partir d'une classe de béton, puis comment l'injecter dans un autre haricot. Le le fait que, dans tous les cas, la fève soit injectée dans un champ défini comme interface n'a pas d'importance - toutes les opérations sont effectuées avec des fèves créées à partir d'instances concrètes.

je peux fournir aussi un autre exemple accrocheur:

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>

comme vous le voyez ici, il est même possible de créer un haricot hors de l'interface! Néanmoins, il ne s'agit pas d'une injection d'interface, car IOC contener initialise instanse de cette fève par ses propres. En d'autres termes, card haricot est une objet initialisé, pas une interface, ce qui rend, que la réponse choisie pour cette question est correcte.

0
répondu Tinki 2016-04-23 11:19:49