[解決済み] Springのオートワイヤリングの仕組みは?
質問
をどのように使用するのか、少し混乱しています。
反転制御
(
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
を使用することもできます。
関連
-
jd-gui Java Exceptionが発生しました。
-
javaで非静的な解を静的な参照にすることができない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】SpringのApplicationContext.getBeanがダメだと言われる理由とは?
-
[解決済み】Spring SecurityのRoleとGrantedAuthorityの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
ファインバグタイプ
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決