春のインタビューでよく聞かれるFactoryBeanと他のBeanの違いは何ですか?

序文

春になると、FactoryBeanは確かに一種の魔法の存在であり、BeanFactoryと混同されることが多く、面接の過程でよく聞かれる質問になっています。実際、FactoryBeanとBeanFactoryはよく理解されており、習得するのに十分です。特定のスキル。

最初の知人

FactoryBeanはファクトリBeanとして変換され、BeanFactoryはBeanファクトリとして変換されます。前者はBeanファクトリbeanFactoryのBeanですが、このBeanは一般的なBeanとは異なり、独自の特別な機能があります。FactoryBeanのインターフェイスは次のとおりです。春に提供、

package org.springframework.beans.factory;

import org.springframework.lang.Nullable;


public interface FactoryBean<T> {

    
    @Nullable
    T getObject() throws Exception;

    
    @Nullable
    Class<?> getObjectType();

    
    default boolean isSingleton() {
        return true;
    }

}

FactoryBeanインターフェースは非常に単純で、getObject、getObjectType、isSingletonの3つのメソッドを提供します。春の多くの機能の基礎となったのはこれらの3つの方法です。春全体のソースコードを検索すると、多くのFactoryBeanが見つかります。春自体によって提供されるものに加えて、いくつかのフレームワークと統合すると、 mybatisなどのFactoryBeans。統合中のSqlSessionFactoryBean、

利用方法

ここでは、FactoryBeanの使用法を示す例として、springboot環境を取り上げます。ソースコードが必要な場合は、公式アカウント[Beidiao Programmer]をフォローして、私とプライベートにチャットできます。

カスタムFactoryBeanは、getObjectメソッドに新しいStudentオブジェクトを作成し、そのオブジェクトを返すだけです。テスト用にtoStringメソッドを書き換えます。

package com.example.myDemo.component;

import com.example.myDemo.po.Student;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class MyFactoryBean implements FactoryBean<Student> {

    @Override
    public Student getObject() throws Exception {

        Student student=new Student();
        return student;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public String toString() {
        return "MyFactoryBean{}";
    }
}

以下はStudentクラスで、2つのプロパティがあり、toStringメソッドを書き換えます。

package com.example.myDemo.po;

public class Student {
    private String name;
    private String code;

    public Student(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{}";
    }
}

これが試験方法です、

package com.example.myDemo;

import com.example.myDemo.component.MyFactoryBean;
import com.example.myDemo.po.Student;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.ApplicationContext;

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MyDemoApplication {

    public static void main(String[] args) {
        ApplicationContext ac=SpringApplication.run(MyDemoApplication.class, args);

        //获得Student对象
        Student stu=(Student) ac.getBean("myFactoryBean");
        //获得MyFactoryBean对象
        MyFactoryBean myFactoryBean=(MyFactoryBean) ac.getBean("&myFactoryBean");
        System.out.println("stu:"+stu);
        System.out.println("myFactoryBean:"+myFactoryBean);

    }

}

最初に印刷結果を見てください。

Studentオブジェクトが「myFactoryBean」を介して取得され、MyFactoryBeanオブジェクトが「&myFactoryBean」を介して取得されるという印刷結果は奇妙です。どうしてこれなの

機能説明

上記の出力結果を見ると、多くの友人が非常に驚いています。はい、これはFactoryBeanの魔法です。素人の言葉で言えば、FactoryBeanはファクトリBeanです。これは、Beanを生成でき、getObejctメソッドを介してBeanを生成できるBeanです。もちろん、FactoryBeanであろうとFactoryBeanによって生成されたBeanがSpringによって管理されていようと、問題はありません。そうでなければ、getBeanメソッドを介して取得することはできません。

前述のFactoryBeanの目的は何ですか。前述のように、FactroyBeanの機能はBeanを生成することです。ここで質問があります。SpringはBeanの生成と管理に使用されます。なぜFactoryBeanが必要なのですか?FactoryBeanの本当の目的開発者にそれらの複雑なBeanを自分で定義させ、管理のためにSpringに引き渡すことです。Beanで多くの変数を初期化し、多くの操作を実行する場合、Springの自動アセンブリを使用するのは難しいため、Spring開発者は引き渡します。これらのタスクは私たちに与えました。一般的な例は、mybatisとspringが統合されている場合、SqlSessionFactoryBeanという名前のFactoryBeanがあります。このFactoryBeanの目的は、Springが管理するSqlSessionFactoryを返すことです。mybatisを使用したことのある人なら誰でも、sqlSessionFactoryを作成するために多くのプロパティが必要であることを知っています。構成されているので、SqlSessionFactoryBeanを使用して、SqlSessionFactoryBeanを見てみましょう。

sqlSessionFactoryBeanのgetObejctメソッドを見てください

public SqlSessionFactory getObject() throws Exception {
        if (this.sqlSessionFactory == null) {
            this.afterPropertiesSet();
        }

        return this.sqlSessionFactory;
    }

getObejctTypeメソッド

public Class<? extends SqlSessionFactory> getObjectType() {
        return this.sqlSessionFactory == null ? SqlSessionFactory.class : this.sqlSessionFactory.getClass();
    }

isSingletonメソッド

public boolean isSingleton() {
        return true;
    }

要約する

この記事は主に友達にFactoryBeanの特別な豆を理解させるものであり、その機能は豆を生産することです。ここに質問があります。getBeanメソッドを使用するときに、「myFactoryBean」と「&MyFactoryBean」の戻り値が渡されるのはなぜですか。1つはFactoryBeanによって生成されたBeanで、もう1つはFactorBeanです。次のパートでは、ソースコードとgetObjectForBeanInstanceメソッドの秘密を明らかにします。物事、注意を払うことを歓迎します。

元のリンク: 
http ://www.cnblogs.com/teach/p/14951920.html

この記事が役に立ったと思われる場合は、リツイート、フォロー、サポートを行うことができます

おすすめ

転載: blog.csdn.net/m0_67645544/article/details/124451778