2013-08-26 6 views
16

java.util.prefs.Preferences Beanをマスタコントローラに挿入しようとしています。アプリケーション-context.xmlファイルがjava.util.prefs.PreferencesのためにBeanを作成しMyClass.classパラメータを必要とするファクトリメソッドにSpring Beanを挿入する方法

@Controller 
class MyController { 
    @Autowired 
    private Preferences preferences; 
} 

:のようにコントローラが見えます。 Iは、Beanを作成するための次のエントリを持っているので、ファクトリメソッドを使用する:

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" /> 

Preferences.userNodeForPackage(パラメータ)は、有利に関連するパラメータクラス要します。この場合、春には、呼び出しを行うことで、Beanを作成する必要があります。

Preferences.userNodeForPackage(MyController.class); 

がどのようにクラスがファクトリメソッドでインスタンスのSpring Beanに渡すことができますか? おかげ

環境情報:

Java 7 
Spring 3.1 

答えて

22

あなたはこれが公式ドキュメントhere、セクション5.4.1で説明されてconstructor-arg要素

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage"> 
    <constructor-arg type="java.lang.Class" value="com.path.MyController" /> 
</bean> 

を指定することができます。静的ファクトリメソッドに

引数コンストラクタは が実際に使用された場合とまったく同じ、 素子を介して供給されます。 ファクトリメソッドによって返されるクラスの型は、この例ではありますが、 に静的ファクトリメソッドが含まれるクラスと同じ型である必要はありません。ファクトリメソッド は、本質的に ファクトで使用されます(class属性ではなくfactory-bean属性 の使用とは別)ので、詳細についてはここでは説明しません。

+0

彼は 'userNodeForPackage()'メソッドではなく、引用符やドキュメントを読んで@NandkumarTekale 'Preferences' –

+2

のコンストラクタにパラメータとして引数を提供する必要があります。これは 'factory-method'属性を指定したときのやり方です。 –

+0

+1良い。 :) –

2
public class Preferences 
{ 
    SomeBean someBean; 

    public void setSomeBean(SomeBean someBean){ 
      this.someBean = someBean; 
    } 

    public static Preferences createSampleBeanWithIntValue(SomeBean someBean) 
    { 
     Preferences preferences= new Preferences(); 
     preferences.setSomeBean(someBean); 
     return preferences; 
    } 
} 

    <bean id="someBean" class="java.util.prefs.SomeBean"/> 

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" > 

    <constructor-arg ref="someBean "/>  
</bean> 

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

-1

は、あなたが "好み" "MyController" のプロパティを作ってみることができます参照を参照してください。その後、

<bean id="MyController" class="com.your.package.MyController"> 
    <property name="preferences" ref="preferences" /> 
</bean> 

など 何かがMyControllerで好みのgetterとsetterメソッドを持っています。

これはうまくいくと思います。

+1

OPの問題は、オブジェクトをautowiringしていません。問題は、静的ファクトリメソッドの指定と引数です。 –

3

私はxmlベースの設定方法はよく分かりませんが、Configurationクラスを使ってどのようにインスタンス化できるかを教えてください。

@Configuration 
public class Config { 
    @Bean(name="preferences") 
    public java.util.prefs.Preferences preferences() { 
     // init 
     return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class); 
    } 
} 

P.S. :

ウェブでスキャンするには、設定クラス/パッケージを追加する必要があります。XMLあなたは以下のように完全な注釈ベースのアプローチ[contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext]したり、設定ファイルでを使用している場合:

<context:component-scan base-package="com.comp.prod.conf" /> 
+0

目に+1目:p –

+0

+1あなたの答えにMavenの春の文章のアーティファクトから来たと言えるでしょうか? –

0

最初のxmlファイルを使用したり、注釈を使用していずれかの「設定」クラスのBeanを作成します。アノテーションを使用してBeanを作成した場合は、@Autowired注釈機能
(または)

<context:component-scan base-package="com.estudo.controller" />
を有効にするには、XML構成を使用してBeanを作成した場合
、あなたはこの<context:annotation-config>を使用することができます 。
注:SpringサーブレットのXMLファイルに上記のタグを定義してください。

0

Spring Frameworkは、ファクトリメソッドを使用してBeanを挿入する機能を提供します。そうするために、Bean要素の2つの属性を使用できます。

factory-method:beanを挿入するために呼び出されるファクトリメソッドを表します。 factory-bean:ファクトリメソッドが呼び出されるBeanの参照を表します。ファクトリメソッドが非静的である場合に使用されます。 クラスのインスタンスを返すメソッドは、ファクトリメソッドと呼ばれます。

public class A { 
public static A getA(){//factory method 
    return new A(); 
} 
} 
関連する問題