春たBeanFactoryとFactoryBeanのの違い

コンセプト

1.BeanFactory

それは、工場出荷時のBeanの管理するために使用されるファクトリクラスであることを示す、工場の終了
まず、我々はたBeanFactoryビーン植物は、豆の生産と管理のための責任があることを理解する必要があります。コンテナのSpring Beanのルートインターフェイスにアクセスするためのインタフェースです。具体的な実装では、IOCのコンテナのための基本的な仕様を提供IOCコンテナ、ではありません。しかし、与えられた多くの実装が春:としてのApplicationContext、AutowireCapableBeanFactory、XmlBeanFactory、DefaultListableBeanFactory、 ClassPathXmlApplicationContext 一般XmlBeanFactoryに使用され、同様に、XmlBeanFactoryクラスは、XML構成メタデータを保持し、システム・アプリケーションまたは完全に設定を構築するためにそれを使用します。

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanFactory {
	String FACTORY_BEAN_PREFIX = "&";
	/**
	* 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,
	* 否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常;
	*/
	Object getBean(String name) throws BeansException;
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
	Object getBean(String name, Object... args) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	
	<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
	<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
	// 判断工厂中是否包含给定名称的bean定义,若有则返回true;
	boolean containsBean(String name);
	// 判断给定名称的bean定义是否为单例模式
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
	/**
	 * 返回给定名称的bean的Class,如果没有找到指定的bean实例,
	 * 则抛出NoSuchBeanDefinitionException异常;
	 */
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	// 返回给定bean名称的所有别名
	String[] getAliases(String name);
}


ApplicationContextたBeanFactory容器は今や一般ApplicationnContext使用される二つのIOC Springフレームワーク、ある
だけでなく、より多くの拡張のために、たBeanFactoryの効果を含みます。BeanFacotry春はより原始的な工場です。オリジナルスプリングたBeanFactoryは、たBeanFactoryインタフェースに由来するAOP機能、WebアプリケーションのApplicationContextインタフェース、などの多くのプラグインをサポートすることができない、たBeanFactoryのApplicationContextは、一般的に使用することが推奨のすべての機能含ま
のApplicationContextを。より指向方法とフレームワークのコンテキストおよび積層におけるApplicationContextの
実装の継承。また、春のフレームワークは、以前に使用されていないことを、我々はオブジェクト層、DAOにサービス層を使用しているに留意すべきで、
そのような依存は、層の間に存在する、サービス層に新しいオブジェクトを持っていました。IOCコンテナスプリングフレームワークが提供すると
、オブジェクトが作成される方法として、XML構成ファイルにDAOレイヤオブジェクトを使用するように構成されるサービス層のニーズを、関係の組み合わせどのように
Springフレームワークの両方を達成します。

2.FactorBean

それは豆であることを示す、豆を終了、通常のビーンは異なる:豆FactoryBeanのは、それは豆から取得したIDに応じて、実際FactoryBeanのたBeanFactoryのgetObject()のではなく、オブジェクトを返すで、インタフェースを実装FactoryBeanのオブジェクトを取得する場合、それ自体FactoryBeanの、シンボルIDおよび取得の前に添加することができます。

一般的に、春は、反射によってビーンタグプロファイルのクラスのインスタンスの属性を使用してクラスを指定し、いくつかのケースでは、ビーン・インスタンス化プロセスが複雑であり、従来の方法と、それに大量に提供することが必要です設定情報。設定の柔軟性が制限され、その後、符号化方式を使用すると、簡単な解決策を得ることができます。春のファクトリクラスは、このインターフェースのカスタマイズを実装するロジックによってビーンをインスタンス化することができ、このorg.springframework.bean.factory.FactoryBean Aのユーザーのためのインタフェースを提供します。スプリングフレームワークのFactoryBeanのインタフェースが重要な位置を占め、春は70以上FactoryBeanの独自の実装を提供します。彼らは、上位のアプリケーションが容易になりに、複雑な豆の例のいくつかの詳細を隠します。Spring3.0開始から、インタフェース宣言の代わりに、FactoryBeanの形という一般的なFactoryBeanのをサポートするために始めました。それは豆であることを示す、豆を終了、通常のビーンは異なる:豆FactoryBeanのそれは豆たBeanFactoryから得られたIDが実際FactoryBeanののgetObject()リターンの目的であるに基づいて、インタフェースを実装します。


public interface FactoryBean<T> {

	/**
	 * Return an instance (possibly shared or independent) of the object
	 * 获取bean对应的实例对象
	 */
	@Nullable
	T getObject() throws Exception;

	/**
	 * Return the type of object that this FactoryBean creates
	 * 获取factoryBean获取到的实例类型
	 */
	@Nullable
	Class<?> getObjectType();

	/**
	 * Is the object managed by this factory a singleton? 
	 * factoryBean创建的实例是否是单实例
	 */
	default boolean isSingleton() {
		return true;
	}

}
测试代码如下:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);

Object object = applicationContext2.getBean("getMyFactoryBean");

System.out.println("实例bean为:"+object);

Object object2 = applicationContext2.getBean("&getMyFactoryBean");

System.out.println("实例bean为:"+object2);

运行结果如下:

实例bean为 :com.test.bean.Student@3bd94634

实例bean为 : com.test.bean.CustomFactoryBean@58a90037

ビーンたBeanFactoryが実際のgetObjectのFactoryBeanの(あるから取得したIDに基づいて、我々が知っていることは、上記の試験の結果、)からではなくFactoryBeanのそのものよりも、オブジェクトを返しますが、FactoryBeanのオブジェクトを取得したい場合は、にIDの前にアンパサンドを追加取得。

差3.BeanFactoryとFactoryBeanの

たBeanFactoryとFactoryBeanの事実なしの比較は、両方の名前だけが特に近いので、時々、比較することが何かを思い付くだろう、たBeanFactoryはIOCコンテナが仕様を提供し、特定を達成するために、IOCのコンテナの最も基本的な形を提供することであり、 FactoryBeanのは、より柔軟な方法をIOC実装Beanの容器を提供すると言うことができ、IOCのコンテナに基づいてFactoryBeanのは、豆を達成するために、プラス簡単な工場のパターンと装飾的なパターンは、我々は柔軟のgetObject()メソッドを設定することができます。実際には、多くのFactoryBeanの春ソース実装クラスは、綿密かつ正確な理解FactoryBeanのために、春が唯一のソースコードを読むために、あります。

リリース7件のオリジナルの記事 ウォンの賞賛1 ビュー323

おすすめ

転載: blog.csdn.net/baidu_36882394/article/details/105229865