Java Springの未知のインジェクションメソッドを詳しく解説

黄舟
リリース: 2017-03-24 10:51:25
オリジナル
1647 人が閲覧しました

はじめに

設定に Spring 設定ファイルXML ファイルを使用すると、実際に Spring で対応するコードを実行できるようになります。たとえば:

  • 要素を使用すると、実際には Spring でパラメータまたはパラメータ化されたコードを実行できます。コンストラクター

  • 要素を使用しており、これにより Spring は実際に setter メソッドを 1 回実行できます

しかし、Java プログラムには、ゲッター メソッドの呼び出し、通常のメソッドの呼び出し、フィールドのフィールドへのアクセスなど、他の種類のステートメントも含まれる場合があります。 Spring はそのようなステートメントに対応する設定構文も提供します:

  • getter メソッドを呼び出す: PropertyPathFactoryBean

  • を使用してクラスまたはオブジェクトの Field 値を呼び出す: FiledRetrievingFactoryBean

  • を使用する通常のメソッドを呼び出す場合: MethodInvokingFactoryBean

を使用して、他のBeanのpropertyvalue

PropertyPathを注入します。FactoryBeanは、対象Beanのプロパティ値(実際にはgetterメソッドを呼び出して返される値)を取得するために使用されます。取得した値を他のBeanに注入することもできます。また、新しいBeanを直接定義することもできます。次の設定ファイルを見てください:

<bean id="person" class="com.abc.Person">
    <property name="age" value="30" />
    <property name="son">
        <!-- 使用嵌套Bean定义属性值 -->
        <bean class="com.abc.service.Son">
            <property name="age" value="11" />
        </bean>
    </property>
</bean>

<bean id="son2" class="com.abc.service.Son">
    <!-- age属性不是直接注入,而是将person中的son的age属性赋值给son2的age属性 -->
    <property name="age">
        <!-- 注意这里使用的是PropertyPathFactoryBean -->
        <bean id="person.son.age" 
            class="org.springframework.beans.factory.config.PropertyPathFactoryBean" />
    </property>
</bean>
ログイン後にコピー

Person クラスと Son クラスの属性は、設定ファイルから確認できますが、現在は提供されていません。主なプログラムは以下の通りです:

public class Test {
    public static void main(String args[]) {
        ApplicationContext ac = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("age=" + ac.getBean("son2", Son.class).getAge());
    }
}
ログイン後にコピー

出力結果:

age=11
ログイン後にコピー

Beanインスタンスのプロパティ値を他のBeanに注入するだけでなく、Beanインスタンスのプロパティ値を直接Beanインスタンスとして定義することもできます。これも PropertyPathFactoryBean を通じて行われます。このセクションを上記の設定ファイルに追加します。

<bean id="son1" 
    class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
    <!-- 确定目标Bean,表明son1来自哪个Bean的组件 -->
    <property name="targetBeanName" value="person" />
    <!-- 确定属性,表明son1来自目标Bean的哪个属性 -->
    <property name="propertyPath" value="son" />
</bean>
ログイン後にコピー

上記の Test クラスを実行し、son2 を Son1 に置き換えます。結果は同じです。

他のBeanのField値を注入する

FieldRetrievingFactoryBeanクラスを通じて、他のBeanのField値を他のBeanに注入したり、新しいBeanを直接定義したりできます。以下は設定の一部です:

<bean id="son" class="com.abc.service.Son">
    <property name="age">
        <bean id="java.sql.connection.TRANSACTION_SERIALIZABLE"
            class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
    </property>
</bean>
ログイン後にコピー

メインのテスト プログラムは上で定義したものと似ていますが、ここでは提供されません。 実行結果は次のとおりです:

age=8
ログイン後にコピー

この設定では、son オブジェクトの age 値は次のとおりです。 java.sql.Connection.TRANSACTION_SERIALIZABLE 値と等しい。上記の定義では、FieldRetrievingFactoryBean ファクトリ Bean を定義するときに、指定される ID は Bean インスタンスの一意の識別子ではなく、指定された Field の (取り出される値) になります。

注: フィールドは 静的 または非晶質のいずれかになります。上記の構成スニペットで指定された Field 式は静的な Field 値であるため、クラス名を通じて直接アクセスできます。 Field 値が非静的である場合、コンテナ内にすでに存在する Bean を通じてアクセスする必要があります。つまり、Field 式の最初のフレーズはコンテナ内にすでに存在する Bean である必要があります。

フィールド値は Bean インスタンスとして定義することもできます。たとえば、次の段落を設定ファイルに追加します。

<bean id="age" 
    class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <!-- targetClass指定Field所在的目标类 -->
    <property name="targetClass" value="java.sql.Connection" />
    <!-- targetField指定Field名 -->
    <property name="targetField" value="TRANSACTION_SERIALIZABLE" />
</bean>
ログイン後にコピー

次の出力をメイン プログラムに追加します。

System.out.println("age=" + ac.getBean("age"));
ログイン後にコピー

実行結果は上記と同じです。

FieldRetrievingFactoryBean を使用して Field 値を取得する場合は、次の 2 つの属性を指定する必要があります:

  • targetClass または targetObject: それぞれ、Field 値が配置されるターゲットまたはターゲット オブジェクトを指定するために使用されます。取得する必要があるフィールドが静的である場合は、targetClass を使用してターゲットを指定し、フィールドが非静的である場合は、targetObject を使用してターゲット オブジェクトを指定します

  • targetField: ターゲット クラスまたはターゲット オブジェクトのフィールド名を指定します

フィールドが静的フィールドの場合、より簡潔な書き方があります:

<bean id="age" 
    class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <!-- value指定哪个类的哪个静态域值 -->
    <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE" />
</bean>
ログイン後にコピー

他のBeanのメソッド戻り値を注入します

MethodInvokingFactoryBeanファクトリBeanを通じて、ターゲットメソッドの戻り値を次のように注入できます。 Beanの属性値。このファクトリ Bean は、指定されたメソッドの戻り値を取得するために使用されます。この値は、静的メソッドまたはインスタンス メソッドのいずれかです。この値は、指定された Bean インスタンスの指定された属性に注入することも、メソッドとして直接定義することもできます。 Bean インスタンス。例を見てください:

<bean id="valueGenerator" class="com.abc.util.ValueGenerator" />
<bean id="son1" class="com.abc.service.Son">
    <property name="age">
        <!-- 获取方法返回值:调用valueGenerator的getValue方法 -->
        <bean 
            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetObject" ref="valueGenerator" />
            <property name="targetMethod" value="getValue" />
        </bean>
    </property>
</bean>
ログイン後にコピー

以下は ValueGenerator です:

public class ValueGenerator {
    public int getValue() { return 2; }
    public static int getStaticValue () { return 3;}
}
ログイン後にコピー

テスト プログラムは引き続き Son1 の age の値を出力します。コードは省略されています。結果は次のとおりです:

age=2
ログイン後にコピー

静的メソッドを呼び出したい場合メソッドの設定を次のように変更します:

<bean id="son1" class="com.abc.service.Son">
    <property name="age">
        <!-- 获取方法返回值:调用valueGenerator的getStaticValue方法 -->
        <bean 
            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="com.abc.util.ValueGenerator" />
            <property name="targetMethod" value="getStaticValue" />
        </bean>
    </property>
</bean>
ログイン後にコピー

テスト結果は次のとおりです:

age=3
ログイン後にコピー

Java は オーバーロード をサポートしているため、メソッド名を指定するだけでは呼び出しが成功する理由を決定できません。上記の設定は、ValueGenerator の両方のメソッドにパラメーターがないためです。メソッドにパラメータがある場合、どのように設定すればよいですか?次の内容を設定ファイルに追加します。

<bean id="sysProps" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="java.lang.System" />
    <property name="targetMethod" value="getProperties" />
<bean>
<bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <!-- 指向上面的sysProps Bean -->
    <property name="targetObject" value="sysProps" />
    <property name="targetMethod" value="getProperty" />
    <!-- 这里配置参数 -->
    <property name="arguments">
        <!-- 使用list元素列出调用方法的多个参数 -->
        <list>
            <value>java.version</value>
        </list>
    </property>
<bean>
ログイン後にコピー

上記の例は、「java.version」をパラメータとして java.lang.System の getProperty メソッドを呼び出すことと同等であり、戻り値は javaVersion という名前の Bean を作成します。これは次と同等です:

javaVersion = java.lang.System.getProperty("java.version");
ログイン後にコピー

前の記事の Field と同じですが、呼び出されるメソッドが静的メソッドの場合、より簡潔なメソッドがあります:

<bean id="myBean"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <!-- 使用staticMethod属性,直接指定目标类的目标方法 -->
    <property name="staticMethod" value="com.abc.util.ValueGenerator.getStaticValue" />
</bean>
ログイン後にコピー

以上がJava Springの未知のインジェクションメソッドを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート