1. BeanFactory
BeanFactoryは、IOCコンテナの最も基本的な形式を定義し、IOCコンテナが準拠する必要がある最も基本的なインターフェイスを提供します。これは、SpringIOCが準拠する最も低く最も基本的なプログラミング仕様です。Springコードでは、BeanFactoryは単なるインターフェイスであり、IOCコンテナの特定の実装ではありませんが、Springコンテナは、DefaultListableBeanFactory、XmlBeanFactory、ApplicationContextなどの多くの実装を提供します。これらはすべて、追加機能を備えた実装です。
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
2. FactoryBean
一般に、Springはリフレクションメカニズムのclass属性を使用して、Beanをインスタンス化する実装クラスを指定します。場合によっては、Beanをインスタンス化するプロセスがより複雑になります。従来の方法に従う場合は、多くの構成情報を提供する必要があります。 。構成方法の柔軟性には限界がありますが、この場合、コーディング方法により簡単なスキームが得られます。Springは、プラントorg.springframework.bean.factory.FactoryBeanクラスインターフェイスを提供することを目的としています。ユーザーは、このインターフェイスカスタマイズロジックシリーズを実装することにより、Beanをインスタンス化できます。
FactoryBeanインターフェースは、Springフレームワークにとって重要な位置を占めています。Spring自体は70を超えるFactoryBean実装を提供します。それらは、いくつかの複雑なBeanのインスタンス化の詳細を隠し、上位レベルのアプリケーションに利便性をもたらします。Spring 3.0以降、FactoryBeanはジェネリックのサポートを開始しました。つまり、インターフェイス宣言がFactoryBeanの形式に変更されました。
package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
このインターフェイスでは、次の3つのメソッドも定義されています。
T getObject():FactoryBeanによって作成されたBeanインスタンスを返します。isSingleton()がtrueを返す場合、インスタンスはSpringコンテナの単一インスタンスバッファプールに配置されます。
boolean isSingleton():FactoryBeanによって作成されたBeanインスタンスのスコープがシングルトンであるかプロトタイプであるかを返します。
クラスgetObjectType():FactoryBeanによって作成されたBeanタイプを返します。
構成ファイルのclass属性で構成された実装クラスがFactoryBeanの場合、getBean()メソッドによって返されるのはFactoryBean自体ではなく、FactoryBean#getObject()メソッドによって返されるオブジェクトです。これは、getBean(をプロキシするFactoryBean#getObject()と同等です。 ) 方法。
例:次のCarが従来の方法で構成されている場合、Carの各属性は要素タグに対応します。
package com.baobaotao.factorybean;
public class Car {
private int maxSpeed ;
private String brand ;
private double price ;
public int getMaxSpeed () {
return this . maxSpeed ;
}
public void setMaxSpeed ( int maxSpeed ) {
this . maxSpeed = maxSpeed;
}
public String getBrand () {
return this . brand ;
}
public void setBrand ( String brand ) {
this . brand = brand;
}
public double getPrice () {
return this . price ;
}
public void setPrice ( double price ) {
this . price = price;
}
}
FactoryBeanを使用して柔軟性を実現する場合、次の例では、コンマ区切り文字を使用して、Carのすべての属性の構成値を一度に指定します。
package com.baobaotao.factorybean;
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean<Car> {
private String carInfo ;
public Car getObject () throws Exception {
Car car = new Car () ;
String [] infos = carInfo .split ( "," ) ;
car.setBrand ( infos [ 0 ]) ;
car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;
car.setPrice ( Double. valueOf ( infos [ 2 ])) ;
return car;
}
public Class<Car> getObjectType () {
return Car. class ;
}
public boolean isSingleton () {
return false ;
}
public String getCarInfo () {
return this . carInfo ;
}
// 接受逗号分割符设置属性信息
public void setCarInfo ( String carInfo ) {
this . carInfo = carInfo;
}
}
このCarFactoryBeanを使用すると、次のカスタム構成方法を使用して、構成ファイルでCarBeanを構成できます。
<bean id =“ car” class =“ com.baobaotao.factorybean.CarFactoryBean”
P:carInfo="法拉利 ,400,2000000"/>
getBean( "car")が呼び出されると、SpringはCarFactoryBeanがリフレクションメカニズムを介してFactoryBeanインターフェイスを実装していることを検出し、SpringコンテナはインターフェイスメソッドCarFactoryBean#getObject()を呼び出して返します。CarFactoryBeanのインスタンスを取得する場合は、getBean(beanName)メソッドを使用するときにbeanNameの前にディスプレイに「&」プレフィックスを追加する必要があります。たとえば、getBean( "&car");
3.違い
BeanFactoryはファクトリ、つまりIOCコンテナまたはオブジェクトファクトリであり、FactoryBeanはBeanです。Springでは、すべてのBeanがBeanFactory(つまり、IOCコンテナ)によって管理されます。ただし、FactoryBeanの場合、このBeanは単純なBeanではなく、オブジェクトを生成または変更できるファクトリBeanであり、その実装は、デザインパターンのファクトリパターンおよびデコレータパターンに似ています。