Spring はどのようにしてオートワイヤリングで IOC を実現するのでしょうか? 質問する

Spring はどのようにしてオートワイヤリングで IOC を実現するのでしょうか? 質問する

私はこれがどういうことなのか少し混乱しています制御の反転( IoC) は で動作しますSpring

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

これはどうでしょう@Autowired

そして、私の場合Controllers、このサービスをどのようにinstantiate利用すればよいのでしょうか?instance

次のようにすればいいのでしょうか?

UserService userService = new UserServiceImpl();

ベストアンサー1

まず、最も重要なことは、すべての Spring Bean が管理され、「アプリケーション コンテキスト」と呼ばれるコンテナー内に「存在する」ということです。

第二に、各アプリケーションにはそのコンテキストへのエントリポイントがあります。Webアプリケーションにはサーブレットがあり、JSFel-resolver などを使用します。また、アプリケーション コンテキストがブートストラップされ、すべての Bean が自動接続される場所があります。Web アプリケーションでは、これが起動リスナーになる場合があります。

オートワイヤリングは、ある Bean のインスタンスを別の 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="..">て、Bean として定義する必要があります@Service。 の唯一の実装となるためUserService、注入されます。
  • アノテーションとは別に@Autowired、Spring では XML で設定可能なオートワイヤリングを使用できます。その場合、既存の Bean と一致する名前またはタイプを持つすべてのフィールドに、自動的に Bean が注入されます。実際、オートワイヤリングの最初のアイデアは、設定なしでフィールドに依存関係を注入することでした。@Inject、などの他のアノテーション@Resourceも使用できます。

おすすめ記事