web-dev-qa-db-ja.com

MyClass.classパラメータを必要とするファクトリメソッドにSpring Beanを注入する方法

マスターコントローラーにJava.util.prefs.Preferences Beanを注入しようとしています。コントローラーは次のようになります。

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

Application-context.xmlファイルは、Java.util.prefs.PreferencesのBe​​anを作成します。ファクトリメソッドを使用するため、Beanを作成するための次のエントリがあります。

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

Preferences.userNodeForPackage(param)は、Preferenceに関連するクラスをパラメーターとして受け取ります。この場合、Springは呼び出しを実行してBeanを作成する必要があります。

Preferences.userNodeForPackage(MyController.class);

ファクトリメソッドでインスタンス化されたSpring Beanにクラスを渡すにはどうすればよいですか?ありがとう

環境情報:

Java 7
Spring 3.1
16
Austin Haws

constructor-arg要素を指定できます

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

これは公式ドキュメント here 、セクション5.4.1で説明されています。

静的ファクトリメソッドへの引数は、コンストラクタを実際に使用した場合とまったく同じように、要素を介して提供されます。ファクトリーメソッドによって返されるクラスの型は、この例では静的ファクトリーメソッドを含むクラスと同じ型である必要はありません。インスタンス(非静的)ファクトリメソッドは(クラス属性の代わりにfactory-bean属性を使用することを除いて)基本的に同じ方法で使用されるため、ここでは詳細を説明しません。

23

さて、XMLベースの設定方法はわかりませんが、Configurationクラスを介してインスタンス化する方法を説明できます。

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

追伸:

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

<context:component-scan base-package="com.comp.prod.conf" />
3
 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/

2
Prabhakaran

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

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

public class A {  
public static A getA(){//factory method  
    return new A();  
}  
}  

最初に、xmlファイルまたはアノテーションを使用して、「Preferences」クラスのBeanを作成します。
これを使用できます<context:annotation-config> xml構成を使用してBeanを作成して@Autowiredアノテーション機能をアクティブにした場合
(または)

<context:component-scan base-package="com.estudo.controller" />
アノテーションを使用してBeanを作成した場合。
注:上記のタグは、spring servlet xmlファイルで定義します