【春シリーズ IOC詳しく解説】

目次

面接の古典的な質問:

1. 春とは何ですか? 春について何を理解していますか?簡単に言えば、Spring は軽量の制御反転 (IoC) およびアスペクト指向 (AOP) コンテナー フレームワークです。

2. IoCとは何ですか? IoC について何を理解していますか? IoC の重要性? オブジェクトをインスタンス化する権利をプログラマから Spring コンテナ コントロールに引き渡す

3. IoCの3つの注入方法(1、セット注入2、構築注入3、自動組立)

3.1 コンストラクターの注入 コンストラクターの注入: コンストラクターを通じて依存オブジェクトを注入します。クラスのコンストラクターで依存オブジェクトのパラメーターを宣言し、コンテナーで構成するときに対応する依存オブジェクトを提供します。オブジェクト インスタンスを作成するとき、コンテナーは自動的に依存オブジェクトをコンストラクターに渡し、依存関係の注入を完了します。

4. SpringとWebコンテナの統合 SpringとWebコンテナの統合プロセス

5. まとめ


序文:

今日は、エディターがオープンソース フレームワークに関する知識学習をお届けします。私のこの記事を読んで、あなたの開発能力が向上することを願っています。

面接の古典的な質問:


1. 春とは何ですか? 春について何を理解していますか?
簡単に言えば、Spring は軽量の制御反転 (IoC) およびアスペクト指向 (AOP) コンテナー フレームワークです。

 Spring フレームワークは、オープン ソースのフルスタック (フルスタック) アプリケーション フレームワークであり、Java プラットフォーム用のコントロール コンテナ実装の反転であり、一般に直接 Spring と呼ばれます。この曲はロッド・ジョンソンによって作成されましたが、その情報を調べてみると、ロッド・ジョンソンが以前に音楽を学んだとは考えにくいです。フレームワークの一部のコア機能は理論的には任意の Java アプリケーションで使用でき、Java Enterprise Edition プラットフォーム上に構築された Web アプリケーションに対する多くの拡張サポートも提供します。Spring はプログラミング モデルを直接実装していませんが、Java コミュニティで人気を博しており、本質的に Enterprise JavaBeans (EJB) モデルを完全に置き換えています。
 

目的: エンタープライズ アプリケーション開発の複雑さを解決する

   機能: EJB の代わりに基本的な JavaBean を使用し、より多くのエンタープライズ アプリケーション機能を提供します。

   以下に示すように (Spring に含まれる関数):

IoC、AoPについて はじめに

Inversion of Control (IoC): Spring は、IoC コンテナーを通じてアプリケーション内のオブジェクトの依存関係を管理します。オブジェクトの作成、アセンブリ、管理がコンテナに引き継がれるため、開発者はビジネス ロジックの実装だけに集中する必要があります。

アスペクト指向プログラミング (AOP): Spring は AOP をサポートしています。これにより、横断的な関心事 (ロギング、トランザクション管理など) をビジネス ロジックから分離し、コードのモジュール性と再利用性を向上させることができます。
 


2. IoCとは何ですか? IoC について何を理解していますか? IoC の重要性?
オブジェクトをインスタンス化する権利をプログラマから Spring コンテナ コントロールに引き渡す

利点: 横断的なロジックとビジネス ロジックの分離により、コードのモジュール性と保守性が向上します。

例: 完成した要件: ファイルアップロード機能を実現するために、顧客にファイルアップロードインターフェースを追加する 使用後、顧客はファイルのアップロード速度が遅すぎると感じ、この機能のパフォーマンスを向上させたいという要求を使用します。 IoC を促進するための要件が​​追加、変更されます。

3. IoCの3つの注入方法( 1 、セット注入2、構築注入3、自動組立

3.1 コンストラクターの注入
コンストラクターの注入: コンストラクターを通じて依存オブジェクトを注入します。クラスのコンストラクターで依存オブジェクトのパラメーターを宣言し、コンテナーで構成するときに対応する依存オブジェクトを提供します。オブジェクト インスタンスを作成するとき、コンテナーは自動的に依存オブジェクトをコンストラクターに渡し、依存関係の注入を完了します。

コードデモ:

package com.lya.ioc;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:42
 *
 * 用户更改信息的接口
 */
public interface UserService {
    public void update();
}

実装クラス:

package com.lya.ioc.service.impl;

import com.lya.ioc.UserService;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-14:44
 */
public class UserServiceImpl1 implements UserService {
    public void update() {
        System.out.println("更改个人信息");

//        System.out.println("上传头像功能");
    }
}

パラメーターなしおよびパラメーター化された構築メソッドを呼び出して記述するコントローラー (アクション) を作成します。

package web;

import com.lya.ioc.UserService;
import com.lya.ioc.service.impl.UserServiceImpl1;

/**
 * @author 程序猿-小李哥
 * @site www.xiaolige.com
 * @company 猪八戒有限集团
 * @create 2023-08-15-15:19
 */
public class UserAction {
    private UserService userService = new UserServiceImpl1();
    public String update(){
        userService.update();
        return "list";
    }
}

Bean の定義: spring.xml ファイルでは、XML 構成要素を使用してアプリケーション内の Bean オブジェクトを定義できます。SpringコンテナはBeanのクラスパスとコンストラクタを設定することで、設定ファイルの定義に従ってBeanオブジェクトを作成・管理することができる。

依存関係の注入の設定: spring.xml ファイルで Bean 間の依存関係を指定し、依存関係の注入を実現するコンストラクター インジェクションを設定することで、依存する Bean (userService) を対象の Bean (userAction) に注入できます。これにより、オブジェクト間の分離が実現し、コードの柔軟性とテスト容易性が向上します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean class="com.ycxw.ioc.web.UserAction" id="userAction">
        <constructor-arg name="userService" ref="userService"></constructor-arg>
    </bean>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

3.2 Setter メソッドの注入
setter メソッドを通じて依存オブジェクトを注入します。クラス内で対応するセッター メソッドを定義し、コンテナ内で設定するときに、対応する属性またはラベルを使用して依存オブジェクトを指定します。オブジェクト インスタンスが作成されると、コンテナは対応する setter メソッドを呼び出して、依存オブジェクトをオブジェクトに挿入します。

サンプルコード:

1. コントローラーを変更する (アクション)

public class UserAction {
	private UserService userService;
	private String uname;
	private int age;
	private List<String> hobby;

	public void test2() {
		System.out.println(this.uname);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}

	public UserAction(String uname, int age) {
		super();
		this.uname = uname;
		this.age = age;
	}

	public UserAction() {
		super();
	}

2. Beanの注入方法(プロパティ)を修正

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean class="com.ycxw.ioc.web.UserAction" id="userAction">
     <property name="userService" ref="userService"></property>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

3.3 インターフェイスの挿入 (自動割り当て)
3. ここで、byType と byName の違いに注意してください。

1. byType (タイプによる自動配線):

byType モードでは、Spring コンテナは属性の型に応じて一致する Bean を見つけ、それを対応する属性に自動的に挿入します。
たとえば、プロパティのタイプが userService の場合、Spring コンテナは userService インターフェイスを実装する Bean を見つけて、それをプロパティに挿入します。
byType パターンを使用するには、ターゲット Bean のプロパティ タイプが他の Bean のタイプと一致する必要があり、コンテナ内に一致する Bean は 1 つだけ存在できます。

2. byName (名前による自動配線):

byName モードでは、Spring コンテナは属性の名前に従って一致する Bean を見つけ、それを対応する属性に自動的に挿入します。
たとえば、プロパティの名前が myBean の場合、Spring コンテナは myBean という名前の Bean を検索し、それをプロパティに注入します。
byName パターンを使用するには、ターゲット Bean のプロパティ名が他の Bean の名前と一致する必要があります。
 


 

4. SpringとWebコンテナの統合
 SpringとWebコンテナの統合プロセス

 理由: モデリング プロセスは、
 問題を解決するのに非常に時間がかかります。
         1. モデリングは不可欠です
         。 2. モデリングは 1 回だけ実行する必要があります
         。 3. モデリング後、各サーブレットは Spring コンテキスト オブジェクト ClassPathXmlApplicationContext を取得できることが期待されます。

  方法:
         1. リスナーの初期化メソッド
         2. Spring コンテキストは tomacat コンテキスト
DemoServlet に保存する必要があります。

package com.lya.ioc.demo;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
 
 
@WebServlet("/springDemo")
public class DemoServlet extends HttpServlet{
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		ClassPathXmlApplicationContext context =(ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
		UserAction userAction = (UserAction) context.getBean("userAction");
		userAction.list();
		
		
		super.service(req, res);
	}
}

監視を構成する

package com.lya.ioc.listener;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.ycx.web.UserAction;
 
public class SpringLoadListener implements ServletContextListener{
 
	@Override
	public void contextInitialized(ServletContextEvent sce) {
System.out.println("初始化......");
		//	拿到Spring的上下文
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
//		将Spring上文保存到Tomcat上下文中
		ServletContext servletContext=sce.getServletContext();
		servletContext.setAttribute("springContext", context);
	
	
	}
	
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
 
<listener>
	<listener-class>com.ycx.ioc.listener.SpringLoadListener</listener-class>
</listener>
 
</web-app>

5. まとめ


1. Spring の役割は、
       他のサードパーティ フレームワークを統合するために使用されるコンテナ フレームワークです

        IOC と aop という 2 つのコア コンポーネントがあります。

2. IOC の役割と
        特徴: 依存性注入、制御の反転

        制御の反転: オブジェクトを作成する権利、およびプログラマが Spring コンテナに手動でオブジェクトを新規作成する権利

        利点: メンテナンスが容易、変更を受け入れる

3.依存性注入の方法で
        注入を設定する

        コンストラクターインジェクション

        自動組立

4. 名前による自動アセンブリ
        : Bean ID に従って Spring コンテキスト内を検索します。

        byType: 属性インターフェースに従って、Spring コンテキスト内の対応するインターフェース実装クラスを検索します。

5. Spring と Web の統合

おすすめ

転載: blog.csdn.net/m0_73647713/article/details/132300471