コンストラクタに引数(処理中に値が決定する)が必要なクラスをDIする場合
どのように実装したらよいのでしょうか。
1.基本的にシングルトンなので動的な引数でインスタンス化は出来ないのでしょうか。
2.そのような場合はコンテナ管理させずにnewしてあげるのが一般的なのでしょうか。
java
1@Controller 2public class HogeController { 3 @Autowired 4 private HogeService service; 5 6 void test(){ 7 int i = 1; 8 String s = "test"; 9 10// 本当は以下のようなことがしたいのですが、どのようにすれば良いのでしょうか。 11 HogeService service = new HogeService(i, s); 12 13 service.print(); 14 } 15} 16 17@Service 18public class HogeService { 19 final int a; 20 final String b; 21 22 HogeService (int a, Sting b){ 23 this.a = a; 24 this.b = b; 25 } 26 27 public void print(){ 28 System.out.println(i); 29 System.out.println(s); 30 } 31}
追加(解決策?)
- new()した方が良いような気もしますがコンテナに登録されたオブジェクトにコンストラクタに引数が渡せました。
java
1@Controller 2public class HogeController { 3 void test(){ 4 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Test.class); 5 TestDI hogeA = (TestDI) context.getBean("getHogeInstance", 1, "@@@"); 6 TestDI hogeB = (TestDI) context.getBean("getHogeInstance", 2, "◆◆"); 7 8 hogeA.print(); 9 hogeB.print(); 10 } 11} 12 13@Service 14public class Test { 15 @Bean 16 @Scope("prototype") 17 HogeService getHogeInstance(int i, String s) { 18 return new HogeService (i, s); 19 } 20} 21 22public class HogeService { 23 final int a; 24 final String b; 25 26 HogeService (int a, Sting b){ 27 this.a = a; 28 this.b = b; 29 } 30 31 public void print(){ 32 System.out.println(i); 33 System.out.println(s); 34 } 35} 36
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/17 06:12
2017/02/17 08:05