私はこれがどういうことなのか少し混乱しています制御の反転( 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
も使用できます。