目次
1.Bean スコープ
1.1 変更された Bean のケース
1.2 デフォルトのスコープとしてシングルトン モードを使用する理由
1.3 スコープ
2.1.1生命周期演示
2.1.2 为什么要先设置属性,在进行初始化
ホームページ Java &#&チュートリアル Java SpringにおけるBeanのスコープとライフサイクルは何ですか

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

May 03, 2023 pm 09:19 PM
java spring bean

1.Bean スコープ

1.1 変更された Bean のケース

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

理由: Bean のデフォルトのスコープはシングルトン モードです。全員が同じオブジェクトを使用することを意味します。以前にシングルトン モードを学んだとき、シングルトンを使用するとパフォーマンスが大幅に向上することは誰もが知っていたため、Spring の Bean のスコープもデフォルトでシングルトン シングルトン モードになります。

@Component
public class Users {

    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}
ログイン後にコピー
@Component
public class Bean1 {

    @Autowired
    private User user;
    public User getUser(){
        System.out.println("Bean1对象未修改name之前 : "+user);
        user.setName("C++");
        return user;
    }
}
ログイン後にコピー
@Component
public class Bean2 {
    @Autowired
    private User user;

    public User getUser(){
        return user;
    }
}
ログイン後にコピー
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        Bean1 bean1 = context.getBean("bean1",Bean1.class);
        System.out.println(bean1.getUser());
        Bean2 bean2 = context.getBean("bean2",Bean2.class);
        System.out.println(bean2.getUser());
    }
}
ログイン後にコピー

1.2 デフォルトのスコープとしてシングルトン モードを使用する理由

  • スペースを節約するために同じリソースのコピーを 1 つだけ作成する

  • オブジェクトの作成や破棄を過剰に行う必要がなくなり、実行速度が向上します。

1.3 スコープ

スコープは一般に、次のように理解されます。プログラム内の変数はスコープと呼ばれます。または、変数が定義されているソース コード内の特定の領域はスコープと呼ばれます。
Bea のスコープは、singleton## など、Spring のフレームワーク全体における Bean の特定の動作パターンを参照します。単一インスタンスのスコープは、 ということを意味します。
BeanSpring 全体でコピーが 1 つだけあり、グローバルに共有されます。その後、他の人がこの値を変更すると、別の ## が行われます。 # person reads は変更された値です。

Spring では、Bean のスコープは動作モデルと呼ばれますが、これは Spring の観点ではシングルトン モデルが動作であり、Spring 全体で Bean が 1 つしか存在できないことを意味するためです。 。

1.4 Bean の 6 つのスコープ

  • singleton:

    単一インスタンスのスコープ

  • prototype:

    プロトタイプ スコープ (複数インスタンス スコープ)

  • request:

    リクエスト スコープ

  • セッション:

    セッションスコープ

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

  • websocket:
  • HTTP WebSocket スコープ

    最後の 4 つは SpringMVC に限定されているため、この段階では最初の 2 つだけを学習します。
1.5 スコープの設定

先ほどのケースに戻りますが、Bean2 は取得した Bean オブジェクトが変更されていないことを期待しているため、シングルトン モードをマルチケース モードに変更できます。

@Scope を使用(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

Java SpringにおけるBeanのスコープとライフサイクルは何ですか@Scope を使用 ( "prototype")

#2. Spring の実行プロセスと Bean のライフサイクルJava SpringにおけるBeanのスコープとライフサイクルは何ですか

Java SpringにおけるBeanのスコープとライフサイクルは何ですかps

: 実行が Bean のプロパティをアセンブルするステップに達すると、属性インジェクションがスキャンされると、クラス インジェクションが最初に停止され、属性が後続のインスタンスで使用される可能性があるため、属性インジェクションが優先されます。方法。

2.1 Bean のライフ サイクル

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

Bean のライフ サイクルは次の 5 つの部分に分かれています:

1. Bean のインスタンス化 (Bean にメモリ領域を割り当てます) )
  • 2. プロパティの設定 (Bean インジェクションとアセンブリ)
  • 3. Bean の初期化
  • BeanNameAware、BeanFactoryAware、ApplicationContextAware インターフェース メソッドなど、さまざまな Aware 通知メソッドを実装します。たとえば、Spring が Bean を初期化するとき、Bean に ID (名前) を割り当てる必要があります。 beanName が正常に設定された場合は、beadNameAware 通知が生成されます。BeanPostProcessor 初期化プレメソッドを実行します (このメソッドがオーバーライドされていない場合は、ソース コードに従ってください)。依存関係注入後に実行される @PostConstruct 初期化メソッドを実行します。操作; 自分で指定した init を実行する -method メソッド (指定されている場合) は Spring の Bean タグで指定されたメソッドです;

この初期化メソッドは上記のものとは異なりますinit は XML 時代の産物であり、@PostConstruct はアノテーション時代の産物です。優先度:Liang氏のメソッドが同時に存在する場合、アノテーションが先に実行され、次にinitが実行されてBeanPostProcessorの初期化ポストメソッドが実行されます(このメソッドがオーバーライドされていない場合はソースコードに従います)。 Java SpringにおけるBeanのスコープとライフサイクルは何ですか

4. Bean を使用します
  • 5. Destroy Bean コンテナを破棄するためのさまざまなメソッド (@PreDestroy、DisposableBean インターフェイス メソッド、destroy- など)方法 。

@PreDestroy和destroy-method的关系和初始化方法的两个关系差不多
优先级:@ProDestroy > 重写的DisposableBean接口方法 > destroy-method

执行流程图如下:

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

ps:实例化和初始化的区别:实例化就是 分配内存空间。初始化,就是把我们一些参数,方法的具体实现逻辑给加载进去。

2.1.1生命周期演示

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

xml配置如下:

Java SpringにおけるBeanのスコープとライフサイクルは何ですか

Bean

public class BeanLifeComponent implements BeanNameAware {
    @PostConstruct
    public void PostConstruct(){
        System.out.println("执行@PostConstruct");
    }
    public void init(){
        System.out.println("执行bean-init-method");
    }
    public void use(){
        System.out.println("正在使用bean");
    }
    @PreDestroy
    public void PreDestroy(){
        System.out.println("执行@PreDestroy");
    }
    public void setBeanName(String s){
        System.out.println("执行了Aware通知");
    }
}
ログイン後にコピー

启动类

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class);
        beanLifeComponent.use();
        context.destroy();
    }
}
ログイン後にコピー

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">
    <content:component-scan base-package="com.beans"></content:component-scan>
    <bean id="1" class="com.beans.BeanLifeComponent" init-method="init"></bean>
</beans>
ログイン後にコピー
2.1.2 为什么要先设置属性,在进行初始化
@Controller
public class TestUser {
    @Autowired
    private Test test;

    public TestUser(){
        test.sayHi();
        System.out.println("TestUser->调用构造方法");
    }
}
ログイン後にコピー

如果这段代码先执行了初始化,也就是其构造方法,会用到test对象,此时还没有设置属性,test就为null,会造成空指针异常。因此必须先设置属性,在进行初始化。

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles