ホームページ  >  記事  >  Java  >  Spring BeanのスコープとJavaのライフサイクルの詳細な分析とソースコード分析

Spring BeanのスコープとJavaのライフサイクルの詳細な分析とソースコード分析

WBOY
WBOY転載
2023-05-08 19:04:06767ブラウズ

Bean スコープとライフサイクル

Bean スコープ

Bean のスコープは、Spring フレームワーク全体における Bean の特定の動作モードを指します。

たとえば、シングルトン スコープとは、Spring 全体で Bean のコピーが 1 つだけ存在し、それがグローバルに共有されることを意味し、他の人が値を変更すると、他の人が読み取るのは変更された値です。

Bean スコープの分類

  • ##singleton: シングルトン スコープ (デフォルト スコープ)

  • ##prototype: プロトタイプ スコープ (複数インスタンス スコープ)
  • #リクエスト: リクエスト スコープ
  • ##セッション: 応答スコープ

  • アプリケーション: グローバル スコープ

  • websocket: HTTP

  • # 注# 最後の 4 つの状態は Spring MVC の値であり、通常の Spring プロジェクトでは最初の 2 つだけです。

  • singleton

Bean はデフォルトでシングルトン状態 (singleton) になります。つまり、同じオブジェクトに対して、誰もが使用します。以前にシングルトン モードを学んだとき、誰もが次のことを知っていました。シングルトンはパフォーマンスを大幅に向上させることができるため、Spring の Bean のスコープもデフォルトでシングルトン モードになります。

説明: IoC コンテナ内のこのスコープには、Bean のインスタンスが 1 つだけあります: Bean の取得 (つまり、applicationContext.getBean およびその他のメソッドを通じて取得)
  • #シナリオ: 通常、ステートレス Bean はこのスコープを使用します (ステートレスとは、Bean のプロパティ ステータスを意味します)。オブジェクトを更新する必要はありません)

  • prototype

説明: このスコープ内の Bean に対する各リクエストは、新しいインスタンスを作成します: Get Bean (つまり、applicationContext.GetBean およびその他のメソッドを通じて) とアセンブリ Bean (つまり、@Autowired を通じて注入) は、新しいオブジェクト インスタンスです。
  • シナリオ: 通常、ステートフル Bean はこのスコープを使用します。

  • request

説明: 各 httpリクエストは、プロトタイプのような新しい Bean インスタンスを作成します。
  • シナリオ: http リクエストとレスポンスの共有 Bean

  • #備考: での使用に限定されます。 SpringMVC

  • ##session

説明: http セッションで、Bean インスタンスを定義します
  • シナリオ: ユーザー応答用の共有 Bean (例: ユーザーのログイン情報の記録)

  • 注: SpringMVC での使用に限定

  • application (理解)

説明: http servlet Context で、Bean インスタンスを定義します

  • シナリオ: Web アプリケーションのコンテキスト情報例: アプリケーションの共有情報の記録

  • 備考: SpringMVC での使用に限定

  • websocket (理解)

説明: HTTP WebSocket のライフサイクルで、Bean インスタンスを定義します

  • シナリオ: WebSocket の各セッションで、ヘッダーMap 構造の情報が保存され、クライアント メッセージ ヘッダーをラップするために使用されます。最初の初期化後は、WebSocket が終了するまで同じ Bean です。

  • 注: Spring WebSocket の使用を制限する

  • シングルトン スコープ (シングルトン) VS グローバル スコープ (アプリケーション)

singleton は Spring Core のスコープ、application は Spring Web のスコープ

  • #singleton は IoC のコンテナ上で動作し、アプリケーションは動作しますサーブレットコンテナ上で

  • #Bean スコープの設定

  • @Scope タグはメソッドまたはクラスのいずれかを変更でき、@Scope には 2 つの設定があります。Method

列挙設定を使用します:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Component
public class UserBeans {
  	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Gujiu");
        user.setPassword("123456");
        return user;
    }
}
値を直接設定します:

@Scope("prototype" )

@Component
public class UserBeans {
    @Scope("prototype")
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Gujiu");
        user.setPassword("123456");
        return user;
    }
}

Spring実行プロセス

コンテナ起動(プロジェクト開始)

  • 設定ファイル読み込み(初期化)

  • xml
  • を使用して Bean を直接登録します
    • Bean

      ルート (スキャン) パスを設定します
    • Bean を

      Spring
    • に保存します。クラス アノテーションをスキャンしてアセンブルします。
  • ##Bean は必要な内容にアセンブルします。クラス (操作の取得)

  • Bean ライフ サイクル

    いわゆるライフ サイクルとは、オブジェクトの誕生から破壊までのライフ プロセス全体を指します。 、このプロセスをオブジェクトのライフサイクルと呼びます。

Bean のライフ サイクル:

Bean のインスタンス化 (JVM の「ロード」に相当し、ゼロから開始し、バイトコードをメモリに変換します。オブジェクト内のオブジェクトメモリが割り当てられているだけです) [ラフハウスを購入]

    プロパティの設定 (Bean インジェクションとアセンブリ) [装飾材料の購入 (外部リソースの導入)]
  • Bean の初期化[家の装飾]
    • 实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打电话给各个装修的师傅]

    • 执行 BeanPostProcessor 初始化前置方法 [师傅勘察环境, 指定装修方案 (前置工作)]

    • 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行 [两类装修师傅进行装修]

    • 执行自己指定的 init-method 方法 (如果有指定的话) [两类装修师傅进行装修]

    • 执行 BeanPostProcessor 初始化后置方法 [装修之后的清理工作]

  • 使用 Bean [房子可以入住使用了]

  • 销毁 Bean [卖掉房子]

生命周期演示

BeanLifeComponent 类:

//@Component
public class BeanLifeComponent implements BeanNameAware {

    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行了 @PostConstruct");
    }

    public void init() {
        System.out.println("执行了 init-method");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行了销毁方法");
    }
}

xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="myComponent" class="com.demo.component.BeanLifeComponent"
          init-method="init" ></bean>
</beans>

调用类:

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent =
                applicationContext.getBean("myComponent", BeanLifeComponent.class);
        System.out.println("使用Bean");
        applicationContext.destroy();
    }
}

运行结果展示:

Spring BeanのスコープとJavaのライフサイクルの詳細な分析とソースコード分析

以上がSpring BeanのスコープとJavaのライフサイクルの詳細な分析とソースコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。