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 検索を実行します。 |
ObjectSE | postProcessAfterInitialization(ObjectSE bean, StringSE beanName) Bean 初期化コールバック(InitializingBean の afterPropertiesSet またはカスタム init メソッドなど)の後に、指定された新しい Bean インスタンスにこの BeanPostProcessor を適用します。 |
boolean | postProcessAfterInstantiation(ObjectSE bean, StringSE beanName) コンストラクターまたはファクトリメソッドを介して Bean がインスタンス化された後、Spring プロパティの設定(明示的なプロパティまたはオートワイヤーから)が発生する前に操作を実行します。 |
void | postProcessBeforeDestruction(ObjectSE bean, StringSE beanName) 破棄する前に、この BeanPostProcessor を指定の Bean インスタンスに適用します。 |
ObjectSE | postProcessBeforeInitialization(ObjectSE bean, StringSE beanName) Bean 初期化コールバック(InitializingBean の afterPropertiesSet またはカスタム init メソッドなど)の前に、この BeanPostProcessor を指定された新しい Bean インスタンスに適用します。 |
ObjectSE | postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName) ターゲット Bean がインスタンス化される前に、この BeanPostProcessor を適用します。 |
void | postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, ClassSE<?> beanType, StringSE beanName) 指定された Bean の指定されたマージ済み Bean 定義を後処理します。 |
PropertyValues | postProcessPropertyValues(PropertyValues pvs, PropertyDescriptorSE[] pds, ObjectSE bean, StringSE beanName) ファクトリが指定された Bean に適用する前に、指定されたプロパティ値を後処理します。 |
boolean | requiresDestruction(ObjectSE 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) ルックアップが J2EE コンテナー内で行われるかどうかを設定します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
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(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 の名前 public ObjectSE postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName) throws BeansException
InstantiationAwareBeanPostProcessor
このメソッドによって null 以外のオブジェクトが返された場合、Bean 作成プロセスは短絡されます。適用される追加の処理は、構成された BeanPostProcessors
からの BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)
コールバックのみです。
このコールバックは、Bean クラスを持つ Bean 定義にのみ適用されます。特に、「工法」の Bean には適用されません。
ポストプロセッサーは、ここで返される Bean オブジェクトの型を予測するために、拡張 SmartInstantiationAwareBeanPostProcessor
インターフェースを実装できます。
InstantiationAwareBeanPostProcessor
の postProcessBeforeInstantiation
beanClass
- インスタンス化される Bean のクラス beanName
- Bean の名前 null
BeansException
- エラーの場合 AbstractBeanDefinition.hasBeanClass()
, AbstractBeanDefinition.getFactoryMethodName()
public boolean postProcessAfterInstantiation(ObjectSE bean, StringSE beanName) throws BeansException
InstantiationAwareBeanPostProcessor
これは、Spring のオートワイヤーが開始される直前の、指定された Bean インスタンスでカスタムフィールドインジェクションを実行するための理想的なコールバックです。
InstantiationAwareBeanPostProcessor
の postProcessAfterInstantiation
bean
- プロパティがまだ設定されていない状態で作成された Bean インスタンス beanName
- Bean の名前 true
。プロパティの入力をスキップする必要がある場合は false
。通常の実装では true
を返します。false
を返すと、後続の InstantiationAwareBeanPostProcessor インスタンスがこの Bean インスタンスで呼び出されなくなります。BeansException
- エラーの場合 public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptorSE[] pds, ObjectSE bean, StringSE beanName) throws BeansException
InstantiationAwareBeanPostProcessor
また、通常は元の PropertyValues に基づいて新しい MutablePropertyValues インスタンスを作成し、特定の値を追加または削除して、適用するプロパティ値を置き換えることもできます。
InstantiationAwareBeanPostProcessor
の postProcessPropertyValues
pvs
- ファクトリが適用しようとしているプロパティ値 (非 null
)pds
- ターゲット Bean に関連するプロパティ記述子 (依存関係型が無視されている - ファクトリが特に処理する - すでに除外されている)bean
- Bean インスタンスは作成されましたが、そのプロパティはまだ設定されていません beanName
- Bean の名前 null
BeansException
- エラーの場合 MutablePropertyValues
public ObjectSE postProcessBeforeInitialization(ObjectSE bean, StringSE beanName) throws BeansException
BeanPostProcessor
afterPropertiesSet
またはカスタム init メソッドなど)の前に、この BeanPostProcessor を指定された新しい Bean インスタンスに適用します。Bean にはすでにプロパティ値が入力されています。返された Bean インスタンスは、元のラッパーの可能性があります。BeanPostProcessor
の postProcessBeforeInitialization
bean
- 新しい Bean インスタンス beanName
- Bean の名前 null
の場合、後続の BeanPostProcessors は呼び出されません BeansException
- エラーの場合 InitializingBean.afterPropertiesSet()
public ObjectSE postProcessAfterInitialization(ObjectSE bean, StringSE beanName) throws BeansException
BeanPostProcessor
afterPropertiesSet
またはカスタム init メソッドなど)の後に、指定された新しい Bean インスタンスにこの BeanPostProcessor を適用します。Bean にはすでにプロパティ値が入力されています。返された Bean インスタンスは、元のラッパーの可能性があります。FactoryBean の場合、このコールバックは、FactoryBean インスタンスと、FactoryBean によって作成されたオブジェクト(Spring 2.0 以降)の両方に対して呼び出されます。ポストプロセッサーは、対応する bean instanceof FactoryBean
チェックを介して、FactoryBean または作成されたオブジェクトのいずれか、あるいはその両方に適用するかどうかを決定できます。
このコールバックは、他のすべての BeanPostProcessor コールバックとは対照的に、InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)
メソッドによってトリガーされた短絡後にも呼び出されます。
BeanPostProcessor
の postProcessAfterInitialization
bean
- 新しい Bean インスタンス beanName
- Bean の名前 null
の場合、後続の BeanPostProcessors は呼び出されません BeansException
- エラーの場合 InitializingBean.afterPropertiesSet()
, FactoryBean
public void postProcessBeforeDestruction(ObjectSE bean, StringSE beanName) throws BeansException
DestructionAwareBeanPostProcessor
DisposableBean の destroy
およびカスタムの destroy メソッドと同様に、このコールバックはファクトリ内のシングルトン Bean(内部 Bean を含む)にのみ適用されます。
DestructionAwareBeanPostProcessor
の postProcessBeforeDestruction
bean
- 破棄される Bean インスタンス beanName
- Bean の名前 BeansException
- エラーの場合 DisposableBean
, AbstractBeanDefinition.setDestroyMethodName(java.lang.String)
public boolean requiresDestruction(ObjectSE bean)
DestructionAwareBeanPostProcessor
注 : 最近追加されたものとしても、この方法は SmartDABPP サブインターフェースではなく DestructionAwareBeanPostProcessor
自体に導入されています。これにより、Spring <4.3 との互換性を維持しながら、既存の DestructionAwareBeanPostProcessor
実装で requiresDestruction
ロジックを簡単に提供できます。また、requiresDestruction
を Spring 5 の Java 8 デフォルトメソッドとして宣言することも簡単です。
DestructionAwareBeanPostProcessor
の実装がこのメソッドの具体的な実装を提供しない場合、Spring の呼び出しメカニズムは、true
(4.3 の前の有効なデフォルト、および Spring 5 の Java 8 メソッドのデフォルトになる)を返すメソッドを暗黙的に想定します。
DestructionAwareBeanPostProcessor
の requiresDestruction
bean
- チェックする Bean インスタンス DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(java.lang.Object, java.lang.String)
が最終的にこの Bean インスタンスのために呼び出されることになっている場合は true
、または不要な場合は false
protected EntityManagerFactoryEE getPersistenceUnit(StringSE unitName)
unitName
- 永続性ユニットの名前 null
setPersistenceUnits(java.util.Map<java.lang.String, java.lang.String>)
protected EntityManagerEE getPersistenceContext(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(StringSE unitName, StringSE requestingBeanName) throws NoSuchBeanDefinitionException
unitName
- 永続性ユニットの名前 (null
または空の場合があります)requestingBeanName
- リクエストしている Bean の名前 NoSuchBeanDefinitionException
- コンテキストにそのような EntityManagerFactory がない場合 protected EntityManagerFactoryEE findNamedEntityManagerFactory(StringSE unitName, StringSE requestingBeanName) throws NoSuchBeanDefinitionException
unitName
- 永続性ユニットの名前 (空になることはありません)requestingBeanName
- リクエストしている Bean の名前 NoSuchBeanDefinitionException
- コンテキストにそのような EntityManagerFactory がない場合 protected EntityManagerFactoryEE findDefaultEntityManagerFactory(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 ルックアップが失敗した場合