ホームページ > Java > &#&チュートリアル > spring-:誰がsetbeanname()?

spring-:誰がsetbeanname()?

Mary-Kate Olsen
リリース: 2025-01-28 22:05:10
オリジナル
710 人が閲覧しました

spring-: who-calls-setBeanName()?

スプリングフレームワークは、Beanの初期化段階にあります。これは、beanがインターフェイスを実装した場合に自動的に発生します。

setBeanName(String beanName)以下は、いつ、誰が、どのように電話するかについての詳細な説明です。 BeanNameAware

誰がを呼びますか?

setBeanName()

spring ioc(制御反転)コンテナ

call

setBeanName() Beanが初期化され、Springコンテキストに登録されている場合、SpringコンテナはBeanがインターフェイスを実装しているかどうかをチェックします。実装されている場合、Springは自動的にメソッドを呼び出し、構成またはデフォルトで定義されている

bean名

bean nameを送信します。 setBeanName()

いつ呼び出されますか?

BeanNameAware setBeanName() Bean初期化段階


beanの後のインスタンス化された後、setBeanName()しかし

他の初期化されたコールバック
  1. または

    など)コールの前に。

    setBeanName()イベントの順序 周辺のライフサイクルイベントを以下に示します: @PostConstruct InitializingBean.afterPropertiesSet()スプリングコンテナインスタンス化された豆。 スプリングは、構成から豆の名前を決定します(

  2. など)。
  3. Beanが実装されている場合、メソッドが呼び出され、Beanの名前はパラメーターとして渡されます。 注入およびその他の初期化操作に依存しています。

    setBeanName()

    1. springを呼び出す方法
    2. @Bean @Component
    3. beanの登録期間
    4. BeanNameAware setBeanName()スプリングすべてのBeanを
    5. アプリケーションコンテキストに登録します
    6. 。 Beanを登録するとき、その名前をBeanに関連付けます(明示的に定義されているか、自動的に生成されます)。
チェック

setBeanName()

初期化期間中、SpringはBeanが
    を達成したかどうかを確認します。その場合、Springは自動的にメソッドを呼び出します。
  1. beanの名前を渡す

    beanの名前はに渡されます:

  2. 構成(
  3. または

    )で指定された名前。 springで生成されたデフォルト名(例:クラス名、最初の文字スケッチ:BeanNameAware対応)。

    BeanNameAware setBeanName()

  4. 単純化されたコードプロセス
  5. 以下は、Beanのライフサイクルでスプリングが呼び出す方法です。

    <code class="language-java">// Spring容器初始化(伪代码)
    public class BeanFactory {
        public Object createBean(Class<?> beanClass, String beanName) {
            // 步骤1:实例化bean
            Object bean = instantiateBean(beanClass);
    
            // 步骤2:检查bean是否实现了BeanNameAware
            if (bean instanceof BeanNameAware) {
                // 步骤3:调用setBeanName()并传递bean的名称
                ((BeanNameAware) bean).setBeanName(beanName);
            }
    
            // 步骤4:继续进行依赖注入和其他生命周期回调
            injectDependencies(bean);
            initializeBean(bean);
    
            return bean;
        }
    }</code>
    ログイン後にコピー

    練習例

    bean定義

    <code class="language-java">@Configuration
    public class AppConfig {
    
        @Bean(name = "tenantA-dataSource")
        public TenantDataSource tenantADataSource() {
            return new TenantDataSource();
        }
    }</code>
    ログイン後にコピー

    Bean実装

    <code class="language-java">import org.springframework.beans.factory.BeanNameAware;
    
    public class TenantDataSource implements BeanNameAware {
        private String tenantName;
        private String databaseUrl;
    
        @Override
        public void setBeanName(String beanName) {
            // 从bean名称中提取租户名称
            if (beanName.contains("-")) {
                this.tenantName = beanName.split("-")[0];
            } else {
                throw new IllegalArgumentException("无效的bean命名约定。预期格式:<tenantname>-dataSource");
            }
    
            // 根据租户名称动态分配数据库URL
            this.databaseUrl = "jdbc:mysql://localhost:3306/" + tenantName + "_db";
            System.out.println("setBeanName() called for: " + beanName + ", resolved tenant: " + tenantName);
        }
    
        public void connect() {
            System.out.println("Connecting to database: " + databaseUrl);
        }
    }</code>
    ログイン後にコピー

    メインアプリケーション

    <code class="language-java">import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
        public static void main(String[] args) {
            // 初始化Spring上下文
            ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    
            // 获取bean
            TenantDataSource tenantA = (TenantDataSource) context.getBean("tenantA-dataSource");
    
            // 使用bean
            tenantA.connect();
        }
    }</code>
    ログイン後にコピー
    output

    <code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA
    Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
    ログイン後にコピー
    ユースケース

    setBeanName()

    動的構成
    1. 豆の名前を使用して関連付けます(テナントに固有の属性など)。

      debug

    2. 豆の名前に応じてデバッグまたはログレコードを追加します。

      プログラミングカスタム

    3. 豆の名前に従って豆の動作を動的に変更します。
    4. の使用を回避する時期
    5. ほとんどのアプリケーションでは、
    または外部構成に依存する方が実用的です。

    ハードコーディングビーン名の依存関係によって複雑すぎるロジックを避けてください。この種の状況では、外部構成ソースまたは動的ルーティングを使用することをお勧めします。 setBeanName()

以上がspring-:誰がsetbeanname()?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート