web-dev-qa-db-ja.com

パラメーターをSpring Beanに動的に渡す方法

私は春が初めてです。

これは、Bean登録のコードです。

<bean id="user" class="User_Imple"> </bean>
<bean id="userdeff" class="User"> </bean>

これは私のBeanクラスです。

public class User_Imple implements Master_interface {

    private int id;
    private User user; // here user is another class

    public User_Imple() {
        super();
    }

    public User_Imple(int id, User user) {
        super();
        this.id = id;
        this.user = user;
    }

    // some extra functions here....
}

これがアクションを実行するための私の主要な方法です:

public static void main(String arg[]) {

    ApplicationContext context = new ClassPathXmlApplicationContext("/bean.xml");
    Master_interface master = (Master_interface)context.getBean("user");

    // here is my some operations..
    int id = ...
    User user = ...

    // here is where i want to get a Spring bean
    User_Imple userImpl; //want Spring-managed bean created with above params
}

次に、このコンストラクターをパラメーターで呼び出したいのですが、これらのパラメーターはメインメソッドで動的に生成されます。これは、bean.configファイルで宣言されているように、静的ではなく、動的に渡したいという意味です。

19
Ramesh J

Constructor Injection をご覧ください。

また、Springbeanの他のライフサイクルインターセプトについては、 IntializingBean および BeanPostProcessor をご覧ください。

5
Chris

私があなたを正しければ、正しい答えは、Beanに引数を渡す#getBean(String beanName、Object ... args)を使用することです。 Javaベースの構成ではどのように行われるかを示しますが、xmlベースの構成ではどのように行われるかを見つける必要があります。

@Configuration
public class ApplicationConfiguration {

  @Bean
  @Scope("prototype") //As we want to create several beans with different args, right?
  String hello(String name) {
    return "Hello, " + name;
  }
}

//and later in your application

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
String helloCat = (String) context.getBean("hello", "Cat");
String helloDog = (String) context.getBean("hello", "Dog");

これはあなたが探しているものですか?

Upd。この答えはあまりにも多くの賛成票を得て、誰も私のコメントを見ません。それは問題の解決策ですが、春のアンチパターンと見なされており、使用しないでください!ファクトリ、ルックアップメソッドなどを使用して適切に処理する方法はいくつかあります。

次のSO postを参照点として使用してください。 実行時にBeanを作成

25
Vadim Kirilchuk

コンストラクターインジェクション/セッターインジェクションを使用するために上記で提案された答えは、探しているユースケースには完全に機能しないと思います。 Springは多かれ少なかれ、コンストラクター/セッターの静的な引数値を取ります。 Spring ContainerからBeanを取得するために動的に値を渡す方法がわかりません。ただし、User_Impleのインスタンスを動的に取得する場合は、ファクトリクラスUser_Imple_Factoryを使用することをお勧めします

 
    public class User_Imple_factory {
        private static ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");

        public User_Imple createUserImple(int id) {
            User user = context.getBean("User");
            return new User_Imple(id, user);
        }
    }
1
nishant

コンストラクター注入が役立ちます。この場合、属性としてIDとユーザーを使用してPOJOを生成し、POJOをコンストラクターに渡す必要があります。構成ファイルのコンストラクター注入では、このコンストラクターを参照としてpojoで参照できます。そのため、IDとユーザーのデータの動的な値を処理します。

お役に立てれば !!

1
Harish Kumar

おそらくUser_Imple(Spring Beanの代わりに)通常のPojoになれば、問題は解決しますか?

<!-- Only use User as a Spring Bean -->
<bean id="userdeff" class="User"></bean>

Java:

public static void main(String arg[])
{
    ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");
    User user = context.getBean(User.class);

    int id = // dynamic id
    Master_interface master = new User_Imple(id, user);
}
0
matsev