3

私はSpring Bootで遊んでいて、Serviceが必要なときに解決するServiceImplのインスタンスを構築しようとしています。現在、私は@Componentという実装に注釈をつけていますが、これは私が望むようにインスタンスを構築する機会を与えません。アプリケーションの起動時に 'singleton' beanとしてインスタンスを登録する

ServiceImplは、ディスク上のファイルへのパスを含む文字列で構成する必要があります。私はアプリケーションの@SpringBootApplicationクラスのメインメソッドでこれを行いたいと思います。

Service service = new Service("C:\\data.bin"); 
container.RegisterSingleton<IService>(service); // now whoever asks for a IService will receive this precise instance 

春の世界ではこのメイクセンスを行います。

多分それはちょうど私たちは通常、セットアップのようなIoCコンテナは、長い.NETの背景から来るの?

LE:私はGoFシングルトンの定義をよく知っています(つまり、他の人がクラスのインスタンスを作成できないようにします)。

@Bean 
public IService service() { 
    return new Service("C:\\data.bin"); 
} 

を春はあなたのためにすべてをautowire必要があります:あなたは@SpringBootApplicationが行う必要があり、同じファイルで

+1

あなたは、事前にこのプロパティを知っていますか?はいの場合は、プロパティに格納して、それをBeanに転送してください。 – dimitrisli

+0

私はプロパティに格納することを考えなかった、これは良い提案です!実際にはあなたは答えにこれを促進することができます:) –

答えて

2

コメントに記載されているように、これは設定ファイルにあなたのロケーションの詳細を格納してから、Spring Beanの初期化時にそれらを挿入することによって行うことができます。 Beanメソッドの作成に直接あなたの財産を注入.By

:私はこれを達成するため行うにはデモ-INGの4つの方法です以下

my.sample.config.A=somelocationA 
my.sample.config.B=somelocationB 
my.sample.config.C=somelocationC 
my.sample.config.D.one=somelocationD1 
my.sample.config.D.two=somelocationD2 

:あなたのapplication.propertiesはこのようになりますと仮定すると、

:小道具を注入

@Bean 
public A myBeanA(@Value("${my.sample.config.A}") String myprop) { 
    System.out.println("from bean A with " + myprop); 
    return new A(myprop); 
} 

.Byコンフィグ全体の変数にertyとあなたのBeanメソッドの作成であることを使用します。

@Value("${my.sample.config.B}") 
private String mylocationB; 
//.. 
@Bean 
public B myBeanB() { 
    System.out.println("from bean B with " + mylocationB); 
    return new B(mylocationB); 
} 

.By Configで環境全体を注入して、必要なプロパティを手で選ぶ:

@Autowired 
private Environment env; 
//.. 
    @Bean 
    public C myBeanC() { 
    String locationC = env.getProperty("my.sample.config.C"); 
    System.out.println("from bean C with " + locationC); 
    return new C(locationC); 
} 

。これはSpring Boot専用の方法です。 Type-safe Configuration Properties@ConfigurationPropertiesというアノテーションを付けると、接頭辞 - 名前空間を定義するBeanを直接指定することができ、その点以降のすべてのパラメータは、そのBeanで定義されたプロパティに自動マッピングされます。一枚で全体の1ファイルコードの下

@ConfigurationProperties(prefix = "my.sample.config.D") 
@Component 
class D { 
    private String one; 
    private String two; 

    public String getOne() { return one; } 

    public void setOne(String one) { 
     System.out.println("from bean D with " + one); 
     this.one = one; 
    } 
    public String getTwo() { return two; } 

    public void setTwo(String two) { 
     System.out.println("from bean D with " + two); 
     this.two = two; 
    } 
} 

package com.example; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.core.env.Environment; 
import org.springframework.stereotype.Component; 

@SpringBootApplication 
public class DemoApplication { 

    @Autowired 
    private Environment env; 

    @Value("${my.sample.config.B}") 
    private String mylocationB; 

    @Bean 
    public A myBeanA(@Value("${my.sample.config.A}") String myprop) { 
     System.out.println("from bean A with " + myprop); 
     return new A(myprop); 
    } 

    @Bean 
    public B myBeanB() { 
     System.out.println("from bean B with " + mylocationB); 
     return new B(mylocationB); 
    } 

    @Bean 
    public C myBeanC() { 
     String locationC = env.getProperty("my.sample.config.C"); 
     System.out.println("from bean C with " + locationC); 
     return new C(locationC); 
    } 

    @ConfigurationProperties(prefix = "my.sample.config.D") 
    @Component 
    class D { 
     private String one; 
     private String two; 

     public String getOne() { return one; } 

     public void setOne(String one) { 
      System.out.println("from bean D with " + one); 
      this.one = one; 
     } 
     public String getTwo() { return two; } 

     public void setTwo(String two) { 
      System.out.println("from bean D with " + two); 
      this.two = two; 
     } 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 

    class A { 
     private final String location; 
     public A(String location) { this.location = location; } 
    } 

    class B { 
     private final String location; 
     public B(String location) { this.location = location; } 
    } 

    class C { 
     private final String location; 
     public C(String location) { this.location = location; } 
    } 

} 
+0

ありがとう、素敵な答え。クラスDを使用する方法を説明すると、より良いことになります。 –

+0

@ EmdadulSawonありがとうございます - ドキュメントのリンクを追加しました。 – dimitrisli

1

。デフォルトではシングルトン(http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes)である必要があります。

編集1:@Componentではなく@Serviceでサービス実装に注釈を付ける必要があります(What's the difference between @Component, @Repository & @Service annotations in Spring?参照)。

編集2:@SpringBootApplicationのクラスに@Beanメソッドを必ずしも入れる必要はありません。アノテーションが@Configurationの任意のクラスに配置できます。

+0

このバージョンを使用して終了しました:) –

関連する問題