2016-12-29 18 views
0

私はSpring DIでロードしたいSpringクラスを以下に示します。デフォルトのコンストラクタでは期待どおりに動作していますが、文字列引数を持つコンストラクタを使用してアノテーションの詳細や構文を教えてもらえます。この文字列引数は実行時です。パラメータ付きコンストラクタでのアノテーション付きのスプリング依存性注入

私はXML構成 "constrctor args"を試して、期待どおりに動作しています。

public someclass(String hostName, int port, String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 

答えて

1

あなたのフィールド(hastName、ポート、ユーザー、パスワード)はサーバー構成のようなプロパティファイルから来ると仮定します。

@Component 
public class SomeClass { 

    @Autowired 
    public someclass(@Value("${server.hostName}") String hostName, @Value("${server.port}") int port, @Value("${server.user}") String user, @Value("${server.passowrd}") String password) { 
     this.user = user; 
     this.password = password; 
    } 
} 

パラメータが静的な値でない場合は、プログラム的な方法を使用します。 Beanのインスタンスを作成する前に、アプリケーションコンテキストをオートワイヤリングする必要があります。

@Autowired 
private ApplicationContext ctx; 

次に、あなたのBeanのスコープを扱うながら

BeanDefinitionRegistry registry = ((BeanDefinitionRegistry) ctx.getFactory()); 

GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
beanDefinition.setBeanClass(SomeClass.class); 
beanDefinition.setLazyInit(false); 
beanDefinition.setAbstract(false); 
beanDefinition.setAutowireCandidate(true); 
beanDefinition.setScope("singleton"); // you should deal your scope. 
ConstructorArgumentValues constructor = beanDefinition.getConstructorArgumentValues(); 
constructor.addIndexedArgumentValue(0, hostName); 
constructor.addIndexedArgumentValue(1, port); 
constructor.addIndexedArgumentValue(3, user); 
constructor.addIndexedArgumentValue(4, password); 

String beanName = "someclass"; // give a name to your bean 

BeanComponentDefinition definition = new BeanComponentDefinition(beanDefinition, beanName); 
BeanDefinitionReaderUtils.registerBeanDefinition(definition, registry); 

は注意してください、あなたのBeanインスタンスを作成し、アプリケーションコンテキストにそれを登録します。あなたは、あなたの構造に応じてリクエストまたはセッションスコープを使用することができます。

最後に、他のクラスでもSomeClassをオートワイヤできます。

@Autowired 
public SomeClass someClass; 
+0

いいえ。これはデータベースに関連していないので、プロパティーファイルからは来ません。したがって、これらは本質的に動的であり、Javaから渡されます。 – Souvik

+0

Hummは、サーバーの起動時にこのスプリングBeanを作成できないことを意味します。コンポーネントスキャンは使用できません。したがって、実行時にこのクラスのインスタンスを作成し、プログラムでSpringアプリケーションコンテキストに登録する必要があります。あなたが望むなら、私はそれについてのより多くの情報を与えることができます。しかし、私はあなたが注釈でそれを行うことはできないと信じています。 – nsylmz

+0

私は多くの情報が私にとって非常に役立つと思います。だから、私が持っているコメントのみのオプションによると、 "新しい"演算子で手動で行うことです。 – Souvik

関連する問題