1. ホーム
  2. java

[解決済み] Springのオートワイヤリングの仕組みは?

2022-03-18 16:19:57

質問

をどのように使用するのか、少し混乱しています。 反転制御 ( IoC で動作します。 Spring .

というサービスクラスがあるとします。 UserServiceImpl を実装しています。 UserService インターフェイスを使用します。

これはどうでしょう @Autowired ?

そして、私の Controllers は、どのようにすればよいのでしょうか? instantiate アン instance このサービスの?

をすればいいのでしょうか?

UserService userService = new UserServiceImpl();

解決方法は?

まず、そして最も重要なことですが、すべてのSpring Beanは管理されています。つまり、アプリケーションコンテキストと呼ばれるコンテナの中で、quot;live"しています。

次に、各アプリケーションには、そのコンテキストへの入り口があります。WebアプリケーションにはServletがあります。 JSF はel-resolverを使用する、など。また、アプリケーションコンテキストがブートストラップされ、すべてのビーン - autowiredが行われる場所があります。ウェブアプリケーションでは、これはスタートアップリスナーになることができます。

Autowiringは、あるBeanのインスタンスを別のBeanのインスタンスの希望するフィールドに配置することで発生します。両方のクラスはビーンであるべきで、すなわち、それらはアプリケーションコンテキストに住むように定義されるべきです。

アプリケーション・コンテキストに住むとは何ですか?これは コンテキスト オブジェクトをインスタンス化するのは、あなたではありません。つまり、あなたは決して new UserServiceImpl() - コンテナは各インジェクションポイントを見つけ、そこにインスタンスを設定します。

コントローラでは、以下のようにするだけです。

@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {

    // Tells the application context to inject an instance of UserService here
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(@RequestParam("username") String username,
           @RequestParam("password") String password) {

        // The UserServiceImpl is already injected and you can use it
        userService.login(username, password);

    }
}

ちょっとした注意点

  • あなたの applicationContext.xml を有効にする必要があります。 <context:component-scan> をスキャンし、クラスが @Controller , @Service などの注釈があります。
  • Spring-MVCアプリケーションのエントリーポイントはDispatcherServletですが、それはあなたからは見えないので、アプリケーションコンテキストの直接的な対話とブートストラップは舞台裏で行われます。
  • UserServiceImpl もビーンとして定義する必要があります。 <bean id=".." class=".."> または @Service アノテーションを使用します。の唯一の実装者になるので UserService であるため、インジェクションされる。
  • とは別に @Autowired アノテーションを使用すると、SpringはXMLで設定可能な自動配線を使用することができます。この場合、既存のBeanと一致する名前または型を持つすべてのフィールドは、自動的にBeanが注入されるようになります。実はこれがautowiringの最初のアイデアで、何の設定もせずに依存性のあるフィールドを注入させるというものでした。その他のアノテーションとして @Inject , @Resource を使用することもできます。