public class PersistenceAnnotationBeanPostProcessor extends ObjectSE implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware, SerializableSE
EntityManagerFactory
EE および EntityManager
EE の注入のために、PersistenceUnit
EE および PersistenceContext
EE アノテーションを処理する BeanPostProcessor。Spring で管理されたオブジェクト内のそのようなアノテーション付きフィールドまたはメソッドは、自動的に挿入されます。 このポストプロセッサーは、アノテーション付きフィールドまたはメソッドがそのように宣言されている場合、EntityManagerFactory
および EntityManager
のサブインターフェースを挿入します。実際の型は早期に検証されますが、共有(「トランザクション」) EntityManager
参照は例外です。この場合、型の不一致が最初の実際の呼び出し時と同じくらい遅く検出される可能性があります。
メモ: 現在の実装では、PersistenceAnnotationBeanPostProcessor は、"unitName" 属性で @PersistenceUnit
および @PersistenceContext
のみをサポートするか、属性をまったくサポートしません(デフォルトのユニットの場合)。それらのアノテーションがクラスレベルで "name" 属性とともに存在する場合、(Java EE 仕様に従って)デプロイヒントとしてのみ機能するため、単に無視されます。
このポストプロセッサーは、Spring アプリケーションコンテキストで定義された EntityManagerFactory Bean(デフォルト)を取得するか、JNDI から EntityManagerFactory 参照(「永続性ユニット参照」)を取得できます。Bean の場合、永続ユニット名は実際のデプロイ済みユニットと照合され、デプロイ済みの名前が見つからない場合は Bean 名がフォールバックユニット名として使用されます。通常、このような EntityManagerFactory Bean のセットアップには、Spring の LocalContainerEntityManagerFactoryBean
が使用されます。代わりに、そのような Bean は JNDI からも入手できます。jee:jndi-lookup
XML 構成要素を使用します(Bean 名がリクエストされたユニット名と一致する)。どちらの場合も、ポストプロセッサーの定義は次のように単純になります。
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>JNDI の場合は、このポストプロセッサーの
"persistenceUnits" map
で対応する JNDI 名を指定します。通常、Java EE デプロイ記述子の一致する persistence-unit-ref
エントリを使用します。デフォルトでは、これらの名前は、"java:comp/env/" 名前空間にある(Java EE resource-ref 規則に従って)リソース参照と見なされます。例:<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> <property name="persistenceUnits"> <map/gt; <entry key="unit1" value="persistence/unit1"/> <entry key="unit2" value="persistence/unit2"/> </map/gt; </property> </bean>この場合、指定された永続性ユニットは、Spring 定義の Bean ではなく、常に JNDI で解決されます。永続クラスのウィービングを含む永続ユニットデプロイ全体は、Java EE サーバーに依存します。永続コンテキスト(つまり、EntityManager 参照)は、サーバーが提供する EntityManagerFactory 参照に基づいて構築され、トランザクション EntityManager 処理のために Spring の独自のトランザクション同期機能を使用します(通常、境界の Spring の
@Transactional
アノテーションとバックエンドとしての JtaTransactionManager
を使用します)。Java EE サーバーの独自の EntityManager 処理を希望する場合は、このポストプロセッサーの "persistenceContexts" map
(または "extendedPersistenceContexts" map
にエントリを指定します。通常は、Java EE デプロイ記述子に一致する persistence-context-ref
エントリを指定します。次に例を示します。
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> <property name="persistenceContexts"> <map/gt; <entry key="unit1" value="persistence/context1"/> <entry key="unit2" value="persistence/context2"/> </map/gt; </property> </bean>アプリケーションがそもそも EntityManager 参照のみを取得する場合は、これだけを指定する必要があります。EntityManagerFactory 参照も必要な場合は、"persistenceUnits" と "persistenceContexts" の両方のエントリを指定し、一致する JNDI ロケーションをポイントします。
注: 一般に、EXTENDED EntityManagers を STATELESS Bean に注入しないでください。つまり、スコープ 'singleton'(Spring のデフォルトスコープ)で定義された Spring Bean で型 EXTENDED
の @PersistenceContext
を使用しないでください。拡張 EntityManagers それゆえ、彼らは(Spring 管理シングルトンが通常です)同時にアクセス Bean に使用してはならない、スレッドセーフではありません。
メモ: デフォルトの PersistenceAnnotationBeanPostProcessor は、"context:annotation-config" および "context:component-scan" XML タグによって登録されます。カスタム PersistenceAnnotationBeanPostProcessor Bean 定義を指定する場合は、デフォルトのアノテーション構成を削除するか、そこでオフにします。
PersistenceUnit
EE, PersistenceContext
EE, 直列化された形式 HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
コンストラクターと説明 |
---|
PersistenceAnnotationBeanPostProcessor() |
修飾子と型 | メソッドと説明 |
---|---|
protected EntityManagerFactoryEE | findDefaultEntityManagerFactory(StringSE requestingBeanName) Spring アプリケーションコンテキストで単一のデフォルト EntityManagerFactory を検索します。 |
protected EntityManagerFactoryEE | findEntityManagerFactory(StringSE unitName, StringSE requestingBeanName) 現在の Spring アプリケーションコンテキストで指定された名前の EntityManagerFactory を検索します。ユニット名が指定されていない場合は、単一のデフォルト EntityManagerFactory(存在する場合)にフォールバックします。 |
protected EntityManagerFactoryEE | findNamedEntityManagerFactory(StringSE unitName, StringSE requestingBeanName) 現在の Spring アプリケーションコンテキストで、指定された名前の EntityManagerFactory を検索します。 |
int | getOrder() このオブジェクトの順序値を取得します。 |
protected EntityManagerEE | getPersistenceContext(StringSE unitName, boolean extended) "persistenceContexts" (または "extendedPersistenceContexts" )マップで定義された、指定されたユニット名の指定された永続化コンテキストを返します。 |
protected EntityManagerFactoryEE | getPersistenceUnit(StringSE unitName) "persistenceUnits" マップで定義されているように、指定されたユニット名の指定された永続性ユニットを返します。 |
protected <T> T | lookup(StringSE jndiName, ClassSE<T> requiredType) 名前で指定されたリソースの JNDI 検索を実行します。 |
void | postProcessBeforeDestruction(ObjectSE bean, StringSE beanName) 破棄する前に、この BeanPostProcessor を指定の Bean インスタンスに適用します。 |
void | postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, ClassSE<?> beanType, StringSE beanName) 指定された Bean の指定されたマージ済み Bean 定義を後処理します。 |
PropertyValues | postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName) ファクトリが特定の Bean に適用する前に、特定のプロパティ値を後処理します。プロパティ記述子は必要ありません。 |
PropertyValues | postProcessPropertyValues(PropertyValues pvs, PropertyDescriptorSE[] pds, ObjectSE bean, StringSE beanName) 使用すべきではありません。 |
boolean | requiresDestruction(ObjectSE bean) 指定された Bean インスタンスがこのポストプロセッサーによる破棄を必要とするかどうかを判断します。 |
void | resetBeanDefinition(StringSE beanName) 指定された名前の Bean 定義がリセットされ、このポストプロセッサーが影響を受ける Bean のメタデータをクリアする必要があるという通知。 |
void | setBeanFactory(BeanFactory beanFactory) 所有ファクトリを Bean インスタンスに提供するコールバック。 |
void | setDefaultPersistenceUnitName(StringSE unitName) @PersistenceUnit / @PersistenceContext アノテーションでユニット名が指定されていない場合に使用される、デフォルトの永続ユニット名を指定します。 |
void | setExtendedPersistenceContexts(MapSE<StringSE, StringSE> extendedPersistenceContexts) EntityManager ルックアップの拡張永続コンテキストを、永続ユニット名から永続コンテキスト JNDI 名へのマップ(EntityManager インスタンスに解決する必要がある)として指定します。 |
void | setJndiEnvironment(PropertiesSE jndiEnvironment) JNDI ルックアップに使用する JNDI 環境を設定します。 |
void | setJndiTemplate(ObjectSE jndiTemplate) JNDI ルックアップに使用する JNDI テンプレートを設定します。 |
void | setOrder(int order) |
void | setPersistenceContexts(MapSE<StringSE, StringSE> persistenceContexts) EntityManager ルックアップのトランザクション永続コンテキストを、永続ユニット名から永続コンテキスト JNDI 名へのマップ(EntityManager インスタンスに解決する必要がある)として指定します。 |
void | setPersistenceUnits(MapSE<StringSE, StringSE> persistenceUnits) EntityManagerFactory ルックアップの永続性ユニットを、永続性ユニット名から永続性ユニット JNDI 名へのマップ(EntityManagerFactory インスタンスに解決する必要がある)として指定します。 |
void | setResourceRef(boolean resourceRef) ルックアップを Java EE コンテナーで行うかどうかを設定します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
postProcessAfterInstantiation, postProcessBeforeInstantiation
postProcessAfterInitialization, postProcessBeforeInitialization
public void setJndiTemplate(ObjectSE jndiTemplate)
public void setJndiEnvironment(PropertiesSE jndiEnvironment)
public void setResourceRef(boolean resourceRef)
public void setPersistenceUnits(MapSE<StringSE,StringSE> persistenceUnits)
ここで指定する JNDI 名は、Java EE デプロイ記述子の persistence-unit-ref
エントリを参照し、ターゲット永続性ユニットと一致する必要があります。
アノテーションでユニット名が指定されていない場合、default persistence unit
に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。
これは主に Java EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManagerFactory 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。
対応する "persistenceContexts "/"extendedPersistenceContexts" " が指定されていない場合、@PersistenceContext
はここで定義された EntityManagerFactory 上に構築された EntityManagers に解決されます。これらは Spring 管理の EntityManagers であり、Spring の機能に基づいてトランザクション同期を実装することに注意してください。Java EE サーバー独自の EntityManager を使用する場合処理には、対応する "persistenceContexts"/"extendedPersistenceContexts" " を指定します。
public void setPersistenceContexts(MapSE<StringSE,StringSE> persistenceContexts)
ここで指定する JNDI 名は、Java EE デプロイ記述子の persistence-context-ref
エントリを参照し、ターゲット永続性ユニットと一致し、永続性コンテキスト型 Transaction
で設定されている必要があります。
アノテーションでユニット名が指定されていない場合、default persistence unit
に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。
これは主に Java EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManager 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。すべての EntityManager 処理は、Java EE サーバー自体によって行われます。
public void setExtendedPersistenceContexts(MapSE<StringSE,StringSE> extendedPersistenceContexts)
ここで指定する JNDI 名は、Java EE デプロイ記述子の persistence-context-ref
エントリを参照し、ターゲット永続性ユニットと一致し、永続性コンテキスト型 Extended
で設定されている必要があります。
アノテーションでユニット名が指定されていない場合、default persistence unit
に指定された値(デフォルトでは、空の文字列にマップされた値)、または 1 つしかない場合は単一の永続性ユニットが使用されます。
これは主に Java EE 環境での使用を目的としており、すべてのルックアップは標準の JPA アノテーションによって駆動され、すべての EntityManager 参照は JNDI から取得されます。このようなシナリオでは、個別の EntityManagerFactory Bean 定義は必要ありません。すべての EntityManager 処理は、Java EE サーバー自体によって行われます。
public void setDefaultPersistenceUnitName(@Nullable StringSE unitName)
@PersistenceUnit
/ @PersistenceContext
アノテーションでユニット名が指定されていない場合に使用される、デフォルトの永続ユニット名を指定します。 これは主にアプリケーションコンテキストでのルックアップを目的としており、ターゲット永続性ユニット名(通常は Bean 名と一致)を示しますが、"persistenceUnits"
/"persistenceContexts"
/"extendedPersistenceContexts"
マップでのルックアップにも適用され、空の文字列のマッピングが重複する必要がなくなります。
デフォルトでは、Spring アプリケーションコンテキストで単一の EntityManagerFactory Bean があるかどうかをチェックします。そのようなファクトリが複数ある場合は、このデフォルトの永続性ユニット名を指定するか、アノテーションで名前付き永続性ユニットを明示的に参照してください。
public void setOrder(int order)
public int getOrder()
Ordered
値が高いほど、優先度は低くなります。結果として、最も低い値を持つオブジェクトが最高の優先度を持ちます(サーブレット load-on-startup
の値に多少似ています)。
同じ順序の値は、影響を受けるオブジェクトの任意のソート位置になります。
Ordered
の getOrder
Ordered.HIGHEST_PRECEDENCE
, Ordered.LOWEST_PRECEDENCE
public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanFactoryAware
の setBeanFactory
beanFactory
- 所有 BeanFactory(非 null
)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。BeanInitializationException
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, ClassSE<?> beanType, StringSE beanName)
MergedBeanDefinitionPostProcessor
MergedBeanDefinitionPostProcessor
の postProcessMergedBeanDefinition
beanDefinition
- Bean のマージされた Bean 定義 beanType
- 管理対象 Bean インスタンスの実際の型 beanName
- Bean の名前 AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Class<?>, java.lang.String)
public void resetBeanDefinition(StringSE beanName)
MergedBeanDefinitionPostProcessor
デフォルトの実装は空です。
MergedBeanDefinitionPostProcessor
の resetBeanDefinition
beanName
- Bean の名前 DefaultListableBeanFactory.resetBeanDefinition(java.lang.String)
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
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)
@DeprecatedSE public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptorSE[] pds, ObjectSE bean, StringSE beanName)
InstantiationAwareBeanPostProcessor
また、通常は元の PropertyValues に基づいて新しい MutablePropertyValues インスタンスを作成し、特定の値を追加または削除して、適用するプロパティ値を置き換えることもできます。
デフォルトの実装は、指定された pvs
をそのまま返します。
InstantiationAwareBeanPostProcessor
の postProcessPropertyValues
pvs
- ファクトリが適用しようとしているプロパティ値 (非 null
)pds
- ターゲット Bean に関連するプロパティ記述子 (依存関係型が無視されている - ファクトリが特に処理する - すでに除外されている)bean
- Bean インスタンスは作成されましたが、そのプロパティはまだ設定されていません beanName
- Bean の名前 null
InstantiationAwareBeanPostProcessor.postProcessProperties(org.springframework.beans.PropertyValues, java.lang.Object, java.lang.String)
, MutablePropertyValues
public void postProcessBeforeDestruction(ObjectSE bean, StringSE beanName)
DestructionAwareBeanPostProcessor
DisposableBean の destroy
およびカスタム destroy メソッドのように、このコールバックは、コンテナーがライフサイクルを完全に管理する Bean にのみ適用されます。これは通常、シングルトンとスコープ Bean の場合です。
DestructionAwareBeanPostProcessor
の postProcessBeforeDestruction
bean
- 破棄される Bean インスタンス beanName
- Bean の名前 DisposableBean.destroy()
, AbstractBeanDefinition.setDestroyMethodName(String)
public boolean requiresDestruction(ObjectSE bean)
DestructionAwareBeanPostProcessor
デフォルトの実装は true
を返します。DestructionAwareBeanPostProcessor
の 5 以前の実装がこのメソッドの具体的な実装を提供しない場合、Spring は true
も暗黙のうちに想定します。
DestructionAwareBeanPostProcessor
の requiresDestruction
bean
- チェックする Bean インスタンス DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(java.lang.Object, java.lang.String)
が最終的にこの Bean インスタンスのために呼び出されることになっている場合は true
、または不要な場合は false
@Nullable protected EntityManagerFactoryEE getPersistenceUnit(@Nullable StringSE unitName)
unitName
- 永続性ユニットの名前 null
setPersistenceUnits(java.util.Map<java.lang.String, java.lang.String>)
@Nullable protected EntityManagerEE getPersistenceContext(@Nullable StringSE unitName, boolean extended)
unitName
- 永続性ユニットの名前 extended
- 拡張永続コンテキストを取得するかどうか null
setPersistenceContexts(java.util.Map<java.lang.String, java.lang.String>)
, setExtendedPersistenceContexts(java.util.Map<java.lang.String, java.lang.String>)
protected EntityManagerFactoryEE findEntityManagerFactory(@Nullable StringSE unitName, @Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
unitName
- 永続性ユニットの名前 (null
または空の場合があります)requestingBeanName
- リクエストしている Bean の名前 NoSuchBeanDefinitionException
- コンテキストにそのような EntityManagerFactory がない場合 protected EntityManagerFactoryEE findNamedEntityManagerFactory(StringSE unitName, @Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
unitName
- 永続性ユニットの名前 (空になることはありません)requestingBeanName
- リクエストしている Bean の名前 NoSuchBeanDefinitionException
- コンテキストにそのような EntityManagerFactory がない場合 protected EntityManagerFactoryEE findDefaultEntityManagerFactory(@Nullable StringSE requestingBeanName) throws NoSuchBeanDefinitionException
NoSuchBeanDefinitionException
- コンテキストに単一の EntityManagerFactory がない場合 protected <T> T lookup(StringSE jndiName, ClassSE<T> requiredType) throws ExceptionSE
JNDI 名が特定の永続性ユニットにマップされるときに、EntityManagerFactory および EntityManager ルックアップのために呼び出されます。
jndiName
- 検索する JNDI 名 requiredType
- オブジェクトの必要な型 ExceptionSE
- JNDI ルックアップが失敗した場合