public class ScriptFactoryPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanClassLoaderAware, BeanFactoryAware, ResourceLoaderAware, DisposableBean, Ordered
ScriptFactory
定義を処理する BeanPostProcessor
。各ファクトリを、それによって生成された実際のスクリプト Java オブジェクトで置き換えます。 これは FactoryBean
メカニズムに似ていますが、スクリプト用に特別に調整されており、Spring のコアコンテナー自体には組み込まれていませんが、拡張機能として実装されています。
注意 : このポストプロセッサーの最も重要な特徴は、コンストラクター引数が ScriptFactory
インスタンスに適用され、Bean プロパティ値が生成されたスクリプトオブジェクトに適用されることです。通常、コンストラクター引数にはスクリプトソースロケーターと潜在的にスクリプトインターフェースが含まれますが、Bean プロパティ値には、スクリプトオブジェクト自体に挿入するための参照と構成値が含まれます。
次の ScriptFactoryPostProcessor
は、以下の 2 つの ScriptFactory
定義に自動的に適用されます。実行時に、実際のスクリプトオブジェクトは、ScriptFactory
インスタンスではなく、"bshMessenger" および "groovyMessenger" に対して公開されます。これらは両方とも、ここでの例の Messenger
インターフェースにキャスト可能であるはずです。
<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/> <bean id="bshMessenger" class="org.springframework.scripting.bsh.BshScriptFactory"> <constructor-arg value="classpath:mypackage/Messenger.bsh"/> <constructor-arg value="mypackage.Messenger"/> <property name="message" value="Hello World!"/> </bean> <bean id="groovyMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory"> <constructor-arg value="classpath:mypackage/Messenger.groovy"/> <property name="message" value="Hello World!"/> </bean>
注意 : 上記の Spring XML Bean 定義ファイルからの抜粋では、<Bean/> -style 構文のみが使用されていることに注意してください(ScriptFactoryPostProcessor
自体の使用を説明するため)。実際には、ScriptFactoryPostProcessor
の <Bean/> 定義を明示的に作成することは決してありません。むしろ、'lang'
名前空間からタグをインポートし、その名前空間のタグを使用してスクリプト化された Bean を作成するだけです... その一環として、ScriptFactoryPostProcessor
が暗黙的に作成されます。
Spring リファレンスドキュメントには、'lang'
名前空間でタグを使用する多数の例が含まれています。例として、'lang:groovy'
タグを使用して定義された Groovy でサポートされた Bean を以下に示します。
<?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:lang="http://www.springframework.org/schema/lang"> <!-- this is the bean definition for the Groovy-backed Messenger implementation --> <lang:groovy id="messenger" script-source="classpath:Messenger.groovy"> <lang:property name="message" value="I Can Do The Frug" /> </lang:groovy> <!-- an otherwise normal bean that will be injected by the Groovy-backed Messenger --> <bean id="bookingService" class="x.y.DefaultBookingService"> <property name="messenger" ref="messenger" /> </bean> </beans>
修飾子と型 | フィールドと説明 |
---|---|
static StringSE | INLINE_SCRIPT_PREFIX インラインスクリプトを示す Resource -style プレフィックス。 |
static StringSE | LANGUAGE_ATTRIBUTE language 属性。 |
protected Log | logger サブクラスで利用可能なロガー。 |
static StringSE | PROXY_TARGET_CLASS_ATTRIBUTE proxyTargetClass 属性。 |
static StringSE | REFRESH_CHECK_DELAY_ATTRIBUTE refreshCheckDelay 属性。 |
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
コンストラクターと説明 |
---|
ScriptFactoryPostProcessor() |
修飾子と型 | メソッドと説明 |
---|---|
protected ScriptSource | convertToScriptSource(StringSE beanName, StringSE scriptSourceLocator, ResourceLoader resourceLoader) 指定されたスクリプトソースロケータを ScriptSource インスタンスに変換します。 |
protected ClassSE<?> | createCompositeInterface(ClassSE<?>[] interfaces) 指定されたインターフェースの複合インターフェースクラスを作成し、指定されたインターフェースを 1 つの単一クラスに実装します。 |
protected ClassSE<?> | createConfigInterface(BeanDefinition bd, ClassSE<?>[] interfaces) 指定された Bean 定義の構成インターフェースを作成し、定義されたプロパティ値の setter メソッド、および init メソッドと destroy メソッド(定義されている場合)を定義します。 |
protected ObjectSE | createRefreshableProxy(TargetSource ts, ClassSE<?>[] interfaces, boolean proxyTargetClass) 指定された AOP TargetSource のリフレッシュ可能なプロキシを作成します。 |
protected BeanDefinition | createScriptedObjectBeanDefinition(BeanDefinition bd, StringSE scriptFactoryBeanName, ScriptSource scriptSource, ClassSE<?>[] interfaces) 指定されたスクリプト定義に基づいて、スクリプトオブジェクトの Bean 定義を作成し、スクリプトオブジェクトに関連する定義データ(つまり、Bean クラスとコンストラクター引数を除くすべて)を抽出します。 |
protected BeanDefinition | createScriptFactoryBeanDefinition(BeanDefinition bd) 指定されたスクリプト定義に基づいて ScriptFactory Bean 定義を作成し、ScriptFactory に関連する定義データのみ(つまり、Bean クラスとコンストラクター引数のみ)を抽出します。 |
void | destroy() シャットダウン時に内部 Bean ファクトリ(スクリプトに使用)を破棄します。 |
int | getOrder() このオブジェクトの順序値を取得します。 |
protected ScriptSource | getScriptSource(StringSE beanName, StringSE scriptSourceLocator) 指定された Bean の ScriptSource を取得し、まだキャッシュされていない場合は遅延して作成します。 |
ObjectSE | postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName) ターゲット Bean がインスタンス化される前に、この BeanPostProcessor を適用します。 |
PropertyValues | postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName) ファクトリが特定の Bean に適用する前に、特定のプロパティ値を後処理します。プロパティ記述子は必要ありません。 |
ClassSE<?> | predictBeanType(ClassSE<?> beanClass, StringSE beanName) 最終的にこのプロセッサーの InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String) コールバックから返される Bean の型を予測します。 |
protected void | prepareScriptBeans(BeanDefinition bd, StringSE scriptFactoryBeanName, StringSE scriptedObjectBeanName) このポストプロセッサーが使用する内部 BeanFactory でスクリプト Bean を準備します。 |
protected boolean | resolveProxyTargetClass(BeanDefinition beanDefinition) |
protected long | resolveRefreshCheckDelay(BeanDefinition beanDefinition) 指定された ScriptFactory BeanDefinition のリフレッシュチェック遅延を取得します。 |
void | setBeanClassLoader(ClassLoaderSE classLoader) Bean class loader SE を Bean インスタンスに提供するコールバック。 |
void | setBeanFactory(BeanFactory beanFactory) 所有ファクトリを Bean インスタンスに提供するコールバック。 |
void | setDefaultProxyTargetClass(boolean defaultProxyTargetClass) インターフェースではなくターゲットクラスをプロキシするためにリフレッシュ可能なプロキシを作成する必要があることを通知するフラグ。 |
void | setDefaultRefreshCheckDelay(long defaultRefreshCheckDelay) リフレッシュチェック間の遅延をミリ秒単位で設定します。 |
void | setResourceLoader(ResourceLoader resourceLoader) このオブジェクトが実行される ResourceLoader を設定します。 |
determineCandidateConstructors, getEarlyBeanReference, postProcessAfterInitialization, postProcessAfterInstantiation, postProcessBeforeInitialization, postProcessPropertyValues
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final StringSE INLINE_SCRIPT_PREFIX
Resource
-style プレフィックス。インラインスクリプトは、外部ファイルで定義されるのではなく、(通常は XML)構成で定義されるスクリプトです。
public static final StringSE REFRESH_CHECK_DELAY_ATTRIBUTE
refreshCheckDelay
属性。public static final StringSE PROXY_TARGET_CLASS_ATTRIBUTE
proxyTargetClass
属性。public static final StringSE LANGUAGE_ATTRIBUTE
language
属性。protected final Log logger
public void setDefaultRefreshCheckDelay(long defaultRefreshCheckDelay)
実際のリフレッシュは、ScriptSource
が変更されたことを示した場合にのみ発生することに注意してください。
public void setDefaultProxyTargetClass(boolean defaultProxyTargetClass)
defaultProxyTargetClass
- 設定するフラグ値 public void setBeanClassLoader(ClassLoaderSE classLoader)
BeanClassLoaderAware
class loader
SE を Bean インスタンスに提供するコールバック。 通常の Bean プロパティの設定後、ただし InitializingBean's
InitializingBean.afterPropertiesSet()
メソッドやカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanClassLoaderAware
の setBeanClassLoader
classLoader
- 所有クラスローダー public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanFactoryAware
の setBeanFactory
beanFactory
- 所有 BeanFactory(非 null
)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。BeanInitializationException
public void setResourceLoader(ResourceLoader resourceLoader)
ResourceLoaderAware
これは ResourcePatternResolver であり、instanceof ResourcePatternResolver
で確認できます。ResourcePatternUtils.getResourcePatternResolver
メソッドも参照してください。
通常の Bean プロパティの設定後、InitializingBean の afterPropertiesSet
またはカスタム init メソッドのような初期コールバックの前に呼び出されます。ApplicationContextAware の setApplicationContext
の前に呼び出されます。
ResourceLoaderAware
の setResourceLoader
resourceLoader
- このオブジェクトによって使用される ResourceLoader オブジェクト ResourcePatternResolver
, ResourcePatternUtils.getResourcePatternResolver(org.springframework.core.io.ResourceLoader)
public int getOrder()
Ordered
値が高いほど、優先度は低くなります。結果として、最も低い値を持つオブジェクトが最高の優先度を持ちます(サーブレット load-on-startup
の値に多少似ています)。
同じ順序の値は、影響を受けるオブジェクトの任意のソート位置になります。
Ordered
の getOrder
Ordered.HIGHEST_PRECEDENCE
, Ordered.LOWEST_PRECEDENCE
@Nullable public ClassSE<?> predictBeanType(ClassSE<?> beanClass, StringSE beanName)
SmartInstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)
コールバックから返される Bean の型を予測します。 デフォルトの実装は null
を返します。
SmartInstantiationAwareBeanPostProcessor
の predictBeanType
InstantiationAwareBeanPostProcessorAdapter
の predictBeanType
beanClass
- Bean の生のクラス beanName
- Bean の名前 null
public PropertyValues postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName)
InstantiationAwareBeanPostProcessor
実装は、カスタム InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
実装を提供する場合は null
(デフォルト)を返し、そうでない場合は pvs
を返す必要があります。このインターフェースの将来のバージョン(InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
が削除された)では、デフォルトの実装は、指定された pvs
をそのまま直接返します。
InstantiationAwareBeanPostProcessor
の postProcessProperties
InstantiationAwareBeanPostProcessorAdapter
の postProcessProperties
pvs
- ファクトリが適用しようとしているプロパティ値 (非 null
)bean
- Bean インスタンスは作成されましたが、そのプロパティはまだ設定されていません beanName
- Bean の名前 InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
の呼び出しを継続する null
(現在の Bean クラスに初期化された PropertyDescriptor
が必要)InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
public ObjectSE postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName)
InstantiationAwareBeanPostProcessor
このメソッドによって null 以外のオブジェクトが返された場合、Bean 作成プロセスは短絡されます。適用される追加の処理は、構成された BeanPostProcessors
からの BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)
コールバックのみです。
このコールバックは、Bean クラスを持つ Bean 定義、および返された Bean 型がここに渡されるファクトリメソッド定義に適用されます。
ポストプロセッサーは、ここで返される Bean オブジェクトの型を予測するために、拡張 SmartInstantiationAwareBeanPostProcessor
インターフェースを実装できます。
デフォルトの実装は null
を返します。
InstantiationAwareBeanPostProcessor
の postProcessBeforeInstantiation
InstantiationAwareBeanPostProcessorAdapter
の postProcessBeforeInstantiation
beanClass
- インスタンス化される Bean のクラス beanName
- Bean の名前 null
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(java.lang.Object, java.lang.String)
, AbstractBeanDefinition.getBeanClass()
, AbstractBeanDefinition.getFactoryMethodName()
protected void prepareScriptBeans(BeanDefinition bd, StringSE scriptFactoryBeanName, StringSE scriptedObjectBeanName)
bd
- メイン BeanFactory の元の Bean 定義 scriptFactoryBeanName
- 内部 ScriptFactory Bean の名前 scriptedObjectBeanName
- 内部スクリプトオブジェクト Bean の名前 protected long resolveRefreshCheckDelay(BeanDefinition beanDefinition)
ScriptFactory
BeanDefinition
のリフレッシュチェック遅延を取得します。BeanDefinition
のキー REFRESH_CHECK_DELAY_ATTRIBUTE
に有効な Number
SE 型である metadata attribute
がある場合、この値が使用されます。それ以外の場合は、defaultRefreshCheckDelay
値が使用されます。beanDefinition
- チェックする BeanDefinitionprotected boolean resolveProxyTargetClass(BeanDefinition beanDefinition)
protected BeanDefinition createScriptFactoryBeanDefinition(BeanDefinition bd)
bd
- 完全なスクリプト Bean 定義 ScriptFactory
protected ScriptSource getScriptSource(StringSE beanName, StringSE scriptSourceLocator)
beanName
- スクリプト化された Bean の名前 scriptSourceLocator
- Bean に関連付けられたスクリプトソースロケーター convertToScriptSource(java.lang.String, java.lang.String, org.springframework.core.io.ResourceLoader)
protected ScriptSource convertToScriptSource(StringSE beanName, StringSE scriptSourceLocator, ResourceLoader resourceLoader)
デフォルトでは、サポートされるロケータは、Spring リソースの場所 ( "file:C:/myScript.bsh"" や "classpath:myPackage/myScript.bsh" など) とインラインスクリプト ( "inline:myScriptText..." ) です。
beanName
- スクリプト化された Bean の名前 scriptSourceLocator
- スクリプトソースロケータ resourceLoader
- 使用する ResourceLoader (必要ならば)protected ClassSE<?> createConfigInterface(BeanDefinition bd, @Nullable ClassSE<?>[] interfaces)
この実装は、CGLIB の InterfaceMaker を介してインターフェースを作成し、指定されたインターフェースから(可能な限り)プロパティ型を決定します。
bd
- の構成インターフェースを作成するための Bean 定義(プロパティ値など)interfaces
- チェックするインターフェース (生成することになっている setter に対応する getter を定義する可能性があります)InterfaceMaker
, BeanUtils.findPropertyType(java.lang.String, java.lang.Class<?>...)
protected ClassSE<?> createCompositeInterface(ClassSE<?>[] interfaces)
デフォルトの実装は、指定されたインターフェースの JDK プロキシクラスを構築します。
interfaces
- マージするインターフェース Proxy.getProxyClass(java.lang.ClassLoader, java.lang.Class<?>...)
SEprotected BeanDefinition createScriptedObjectBeanDefinition(BeanDefinition bd, StringSE scriptFactoryBeanName, ScriptSource scriptSource, @Nullable ClassSE<?>[] interfaces)
bd
- 完全なスクリプト Bean 定義 scriptFactoryBeanName
- 内部 ScriptFactory Bean の名前 scriptSource
- スクリプト化された Bean の ScriptSourceinterfaces
- スクリプト化された Bean が実装することになっているインターフェース ScriptFactory.getScriptedObject(org.springframework.scripting.ScriptSource, java.lang.Class<?>...)
protected ObjectSE createRefreshableProxy(TargetSource ts, @Nullable ClassSE<?>[] interfaces, boolean proxyTargetClass)
ts
- リフレッシュ可能な TargetSourceinterfaces
- プロキシインターフェース (ターゲットクラスによって実装されたすべてのインターフェースのプロキシを示す null
の場合があります)RefreshableScriptTargetSource
public void destroy()
DisposableBean
の destroy