38

これまでのところ、Spring Framework でのインターフェイス注入の正しい例を提供できる人は誰もいませんでした。

マーティン・ファウラーの記事は人間向けではなく、他のすべては非常に紛らわしい方法で配置された単語にすぎません. 私は 30 件の記事を閲覧しましたが、そこでは人々が「Spring はインターフェイス インジェクションを直接サポートしていません」(「セッターとコンストラクターのインジェクションのみを説明する方法が正確にわからないため」)、または「それについて説明します」と言っています。私の他のスレッドで」または、それが間違った例であると言うコメントが以下にいくつかあります. 私は説明を求めません。たとえば、お願いします。

インジェクションには、コンストラクター、セッター、インターフェイスの 3 種類があります。Spring は最新のものを直接サポートしていません (人々が言っ​​ているように)。では、正確にはどのように行われるのでしょうか。

ありがとうございました、

4

7 に答える 7

16

春のDIのバリアントによると

DI には、コンストラクター ベースの依存性注入とセッター ベースの依存性注入の 2 つの主要なバリアントがあります。

また、インターフェース注入はSpringでは実装されていませんを参照してください明確に述べています。

したがって、DI には 2 つのバリエーションしかありません。したがって、ドキュメントにインターフェース注入について何も書かれていない場合、そこにないことは明らかです。インターフェースにセッターメソッドを提供することでインターフェース注入が行われると信じている人は、私に答えてください:

  1. spring ref doc がインターフェース注入の言及を残したのはなぜですか?
  2. セッターインジェクション自体と見なされないセッターメソッドを提供することにより、インジェクションをインターフェースできないのはなぜですか。インターフェイスの導入が何にも影響しないのに、なぜそのための特別な用語を作成するのですか。つまり、それはまだ同じように構成されているということです。それらが異なっていた場合、構成を見てどのようにそれを見つけることができますか。構成内で、実際に構成されたクラスがいくつかのインターフェースを実装している impl が表示されないことは透過的であるべきではありませんか?
  3. インスタンス ファクトリ メソッドを使用したインスタンス化と静的ファクトリ メソッドを使用したインスタンスように、一部の Bean 属性はインターフェイス インジェクションを明確にする必要がありますか?
于 2015-07-06T11:41:09.910 に答える
10

インターフェイス注入では、依存関係を設定できるポイントをインターフェイスが明示的に定義します。

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

class Company implements InjectPerson {
   Person injectedPerson; 

   public void injectHere(Person p) {
        this.injectedPerson = p;
    }
}
于 2012-04-20T14:37:08.343 に答える
6

こんにちは私はあなたの答えを明確にすることができる非常に単純なアプローチで試しました.

以下は、2 つのインターフェイスと 2 つの Bean クラスを使用して構築したコードです。

Job という名前の最初のインターフェース。

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

そして、このインターフェイスを MyJob という名前で実装する 1 つのクラス

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

次のステップでは、サービスという名前の別のインターフェイスを作成しました

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>

また、別のオンライン チュートリアルを参考にして、この種の解決策を得ました。このコードに問題がある場合はお知らせください。それは私のために働いています。

于 2013-02-04T10:14:32.407 に答える
4

依存性注入には 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)と春がサポートするもの(2つ)で混乱しているようです。

于 2015-08-11T11:46:42.217 に答える
1

誰かがここであなたの質問に答えたと思います 「Webフローブックを使用したPro Spring MVC」からこのステートメントを読むまで、インターフェイスインジェクションが何であるかも知りませんでした

「インターフェースベースの依存性注入は Spring Framework ではサポートされていないことに注意してください。これは、特定のインターフェースに注入する具体的な実装を指定する必要があることを意味します。」

于 2014-08-28T13:29:47.397 に答える