web-dev-qa-db-ja.com

春の依存性注入自動配線ヌル

RestTemplateを使用して自動配線することができました。ただし、コードの残りのテンプレート関連部分を次のように別のクラスに移動したいと思います。

public class Bridge {

    private final String BASE_URL = "http://localhost:8080/u";

    @Autowired
    RestTemplate restTemplate;

    public void addW() {
       Map<String, String> x = new HashMap<String, String>();
       W c = restTemplate.getForObject(BASE_URL + "/device/yeni", W.class, x);
       System.out.println("Here!");
    }
}

そして別のクラスで私はそれを呼びます:

...
Bridge wb = new Bridge();
wb.addW();
...

私はSpringとDependencyInjectionの用語に不慣れです。私のrestTemplate変数はnullであり、例外をスローします。それを解決する方法は何ができますか(newキーワードを使用することに関連しているかどうかはわかりません)?

15
kamaci

Bridge wb = new Bridge()の使用は、依存性注入では機能しません。 restTemplateはSpringによって管理されていないため、wbは注入されません。

BridgeをSpringBean自体にする必要があります。注釈による:

@Service
public class Bridge {
    // ...
}

またはBean宣言による:

<bean id="bridge" class="Bridge"/>
11
jeha

Jehaの正解にさらに追加するだけです。

現在、

Bridge wb = new Bridge();

つまり、そのオブジェクトインスタンスは「SpringManaged」ではありません。春はそれについて何も知りません。では、どうすればそれが何も知らない依存関係を注入できるのでしょうか。

だからジェハが言ったように。 @Serviceアノテーションを追加するか、アプリケーションコンテキストxml構成ファイルで指定します(または、Spring 3を使用している場合は、@ Configuration オブジェクト)

次に、Springコンテキストが起動すると、BeanFactoryにBridge.classのシングルトン(デフォルトの動作)インスタンスがあります。それを他のSpring-Managedオブジェクトに挿入するか、手動で引き出します。

Bridge wb = (Bridge) applicationContext.getBean("bridge"); // Name comes from the default of the class

これで、依存関係が組み込まれます。

6

新しい演算子を使用し、すべての依存性を注入したい場合は、これをSpringコンポーネントにするのではなく(@Serviceでアノテーションを付けることにより)、@ Configurableクラスにします。

このようにして、オブジェクトでさえ、新しい演算子の依存関係によってインスタンス化されます。

構成もほとんど必要ありません。詳細な説明とサンプルプロジェクトは ここ です。

http://spring-framework-interoperability.blogspot.in/2012/07/spring-managed-components.html

3
Lalit Jha