免責事項:この記事はブロガーオリジナル記事です、ソースを明記してください。https://blog.csdn.net/u010597819/article/details/88750491
春の総務を有効にします
- @EnableTransactionManagement、はい限り、トランザクションマネージャとしての効果を取るために、スプリング総務へのノートの増加を可能にするために、当然のことながら、また、トランザクションのトランザクションマネージャを実装する必要があります
- 入力し、「トランザクション・ノートを有効にする、」我々は、輸入関連の設定の導入の内部を見ることができます
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
- あなたは、クラスを意味するブロガーを見ることができます別の記事(、TransactionManagementConfigurationSelectorの導入を見ることができますspringboot注釈スプリング-IOC-ソース学習は)輸入セレクタクラスが含まれている豆、全体のスプリングロードプロセスを詳しく説明している、私が案内しますその役割は、実際には、注釈の設定のインポートBeanによって行われる、デフォルトモードは、プロキシモードで注釈プロキシ、で、ProxyTransactionManagementConfigurationとAutoProxyRegistrarは、工場出荷時に登録されます
@Override
protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
return new String[] {AutoProxyRegistrar.class.getName(),
ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[] {
TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};
default:
return null;
}
}
- 植物への注釈AutoProxyRegistrarクラスコンフィギュレーションInfrastructureAdvisorAutoProxyCreator(SmartInstantiationAwareBeanPostProcessor)後処理レジスタ
- ProxyTransactionManagementConfigurationの設定クラスは、クラスでの主要な提供BeanFactoryTransactionAttributeSourceAdvisor、transactionAttributeSourceは、transactionInterceptor 3つのBeanは、バック3の特定の役割を紹介します豆のさらに具体的な議論
- この時点で、トランザクションを有効にするには、全体のプロセスが正常に完了しました
春の総務を使用するように設定
- springbootが自動的に設定春の業務を統合されている、つまり、我々は、我々がspringbootが自動的に私たちのために設定されているかを見てみましょう、それが直接@Transactional使用され、もはや、特別な春事務を設定する必要がない直接使用することができます
- その後、我々は、取引モジュール内部のスプリング・ブート・自動構成・1.5.19.RELEASE.jarに追いつくために持っている:org.springframework.boot.autoconfigure.transaction.TransactionAutoConfigurationは、その後、我々はまだいくつかの棚ぼたああを持っています
- 自動コンフィギュレーションクラスの内容を参照してください、我々はそれがフォーラムで述べた前に私たちはしばしば問題を見ていること、それは自動的に私たちにトランザクションを可能にするように設定された、またはブログ、理由は、静的な内部クラスのEnableTransactionManagementConfigurationを見つけました私は@EnableTransactionManagementを設定する必要はありませんが、あなたは間違いなく可能性があるspringbootを投影するために使用されている場合、トランザクションは、まだ有効です
@Configuration
@ConditionalOnBean(PlatformTransactionManager.class)
@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
public static class EnableTransactionManagementConfiguration {
@Configuration
@EnableTransactionManagement(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {
}
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
public static class CglibAutoProxyConfiguration {
}
}
- DataSourceTransactionManager達成トピックに戻る、私たちはクラスは自動的に私たちのためにトランザクションマネージャのDataSourceTransactionManagerAutoConfigurationを設定するように設定されていることを確認することができ、デフォルトの内部を見ることができます
@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
public DataSourceTransactionManager transactionManager(
DataSourceProperties properties) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(
this.dataSource);
if (this.transactionManagerCustomizers != null) {
this.transactionManagerCustomizers.customize(transactionManager);
}
return transactionManager;
}
原則春の総務
私たちは、自動的に私たちの業務を構成する方法springbootを理解するためにspringbootプロジェクト、だけでなく、シンプルで春の総務を使用する方法を学びました以前の二つの部分から、ここでは、必然的に取引の春が達成されるか疑問に思う、当然のことながら、多くの人が最初に反応してもよいですspringAOPそれが使用されて、はい、はい、正確にどのようにコードに織り込ま?私はさらにそれは、HIAHIAHIAをその神秘的なベールを開いてみましょう。。。
あなたは春のソース人は、あなたが、もちろん、要約版を合理化ブロガーがあり、上記のブロガーのブログ記事ビュー詳細ロードプロセスに行くことができるかどうかわからない、豆のライフサイクルを理解する必要があります読んだことがある場合は(春IOC負荷要約)
- もちろん、私たちのブレークスルーは、豆の初期化プロセスのトランザクションを使用することです。豆の初期化プロセスのトランザクションの使用から答えを見つけることができます、あなたが見つけて、デバッグブレークポイントの方法を介して特定のポイントに移動することができます
- 詳細に記載されていない、トランザクションコードスプリング製織点を初期化、すなわちInfrastructureAdvisorAutoProxyCreator、完了した後の後処理(postProcessAfterInitialization)ビーンに行われ、これは右EnableTransactionManagement注釈AutoProxyRegistrarはregisterBeanDefinitionsを登録するために、工場の内部に配置されています(AopConfigUtils。registerAutoProxyCreatorIfNecessary)
- InfrastructureAdvisorAutoProxyCreatorの親クラスのメソッドpostProcessAfterInitialization、Advisorはプロキシを作成するために、対応する通知があった場合は、パッケージを指定する必要がある場合Beanは、キャッシュが含まれていない場合
- InfrastructureAdvisorAutoProxyCreator親クラスのメソッドgetAdvicesAndAdvisorsForBeanは、資格の顧問通知findEligibleAdvisorsを見つけます
- BeanFactoryTransactionAttributeSourceAdvisor:Beanを達成するために、工場からのすべてのアドバイザは、つまり、前の設定が含まれて検索
- beanNameフラグを設定よれば、現在のプロキシのフラグが作成され、放出はProxyCreationContextが完了した後である。SetCurrentProxiedBeanName(のbeanName)。
- BeanクラスリストAopUtilsに従って対応する通知エージェントを得る。FindAdvisorsThatCanApply(candidateAdvisors、たbeanClass)。
- アプリケーションがAopUtils.canApplyことができるかどうかを決定します
- 通知のIntroductionAdvisorタイプ、IntroductionAdvisorタイプClassFilterに強いGETは試合に一致することがtrueを返した場合、その後、試合はコレクション通知に返される資格があるかどうかを判断する場合
- 通知がhasIntroductionsを示し、それが空である。この時点で修飾されていない場合、応じhasIntroductionsを見つけるために、真続けることです
- 通知がある場合PointcutAdvisorタイプ(すなわち、通知の種類の自動設定前)
- 強いとPointcutAdvisorsに入るには、ポイントカットを決定するために継続します
- ポイントカットGET ClassFilterマッチのマッチング、試合が続くかどうかを判断します
- それはMethodMatcherであればポイントカット、MethodMatcherを得る。TRUEを返すにその試合の本当の例を修飾予告通り
- MethodMatcherはIntroductionAwareMethodMatcherタイプ、強力なターンがある場合IntroductionAwareMethodMatcher
- すべてのインターフェイスとintroductionAwareMethodMatcherが一致するか決意を整合するマッチング方法がmethodMatcherと一致するかどうかを決定する方法がtrueを返すターゲットクラスを横断するそれらの方法
- 通知リストの資格のリターンを発注
- プロキシ通知がある場合はロゴが作成されています
- エージェントを作成するcreateProxy
- 植物がConfigurableListableBeanFactoryタイプである場合、エージェントは、ターゲットBean定義class_がの_ORIGINAL_TARGET_CLASS_ATTRIBUTE属性値を追加されました
- プロキシファクトリProxyFactoryを作成し、ProxyConfig構成(proxyTargetClass、最適化、exposeProxy、凍結し、不透明)をコピー
- proxyTargetClassが偽として構成されており、豆_PRESERVE_TARGET_CLASS_ATTRIBUTE属性定義がfalseの場合_evaluateProxyInterfacesを実行している、または真proxyTargetClassに再設定します
- 通知buildAdvisorsの構築
- 公告のinterceptorNamesへのアクセス:デフォルトはNO共通のインターセプタIS、デフォルトは空です
- 公共の通知が空でないとapplyCommonInterceptorsFirstに設定されている場合、バック、フロントを傍受または入れて置きます
- 、通話がAdvisorAdapterタイプアダプタタイプsupportsAdviceであれば、それはMethodInterceptorのタイプDefaultPointcutAdvisorリターンとしてパッケージ化されている場合は、通知顧問ダイレクトリターンの一種である場合はサポートのタイプかどうかを判断し、もしそうなら:advisorAdapterRegistry.wrap:パッケージを傍受し、対応する通知を作成するために、すべてのインターフェイスを通過しますリターン
- 戻るニュース一覧へ
- advisorsPreFiltered、プレフィルタがtrue ProxyFactoryに設定されている場合に設定顧問、targetSource、freezeProxy、
- proxyClassLoaderに応じgetProxyエージェントを作成します
- AOPプロキシcreateAopProxyの作成、リスナーAdvisedSupportListener.activatedを知らせます
- aopProxyFactory工場を取得することは、プロキシcreateAopProxyを作成します。ObjenesisCglibAopProxyターゲットクラスがインターフェイスではなく、プロキシエージェントが使用されていない場合、デフォルトは、JdkDynamicAopProxyです
- プロキシJdkDynamicAopProxy.getProxy、InvocationHandlerです現在のインスタンスJdkDynamicAopProxyを作成するように作用する工場
- プロキシBeanを返します。
- これまでのところ、私たちはのは、トランザクションのためのエージェントが、スプリングパックされどのようにJDKを見ていきましょう、はい、それはダイナミックな機関で、トランザクションと春AOPを実装する方法を学びました
春総務JDKの動的プロキシ実装の原則
- 達成JdkDynamicAopProxy
- それは、このような直接的なリターン・ターゲットの呼び出しなどのメソッドを等しい場合
- 通知インターセプタチェーンのチェーンを取得します。advised.getInterceptorsAndDynamicInterceptionAdvice(メソッド、targetClass)を、それがProxyConfigがProxyFactoryであることをお勧め
- チェーンが空の場合、インターセプターは、直接呼び出しを反映し(したがって性能は、いくつかの実施形態のCGLIBバイトコードパフォーマンスの低下よりも達成されます)
- 空の場合は、パッケージが進んでインターセプタチェーンReflectiveMethodInvocationコールではありません
- 呼が最後のコールチェーンのノードである場合(currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1)直接invokeJoinpoint反射コール
- それ以外の場合は、コールおよび増分currentInterceptorIndexのinterceptorsAndDynamicMethodMatchersインスタンスからcurrentInterceptorIndexのインデックスを取得します
- タイプが取得された場合methodMatcher InterceptorAndDynamicMethodMatcherマッチが決定されるかどうか、対応するコールinterceptor.invoke(この)。その後、次のノードに直接進んでいない場合は呼び出しに進みます
- そうでない場合(これ)を呼び出す呼び出し強いMethodInterceptorのにInterceptorAndDynamicMethodMatcherタイプ
- 私たちは、自動設定TransactionInterceptorで前に記載されている、さらに外観スプリング総務インターセプターコメント
- あなたは、コールがコールバックインターセプタの次のノード(すなわち、ネストされたシナリオのトランザクション)を呼び出していきます後に見ることができ、これは再帰呼び出しのパラメータであり、オブジェクトはcurrentInterceptorIndexインクリメントれます
- 総務が含まれているinvokeWithinTransactionコールインターセプタ・メソッド
- TransactionAttributeSourceトランザクション属性の取得元、すなわちAnnotationTransactionAttributeSource、特定の分析方法トランザクションは、例えば、getTransactionAttribute属性:SpringTransactionAnnotationParserパーサーアノテーションは属性に対応します
- トランザクションに従って取得を設定すると(実際の呼び出しは、何が構成に応じて対応するトランザクションマネージャを取得しますが存在しない場合、ロードされたトランザクション・マネージャーを待つ必要がないときにキャッシュからトランザクションマネージャを取得します)、対応するトランザクションマネージャを属性なので、コンフィギュレーショントランザクションマネージャは、空に空に設定されていない場合、我々は何があるでしょうどのような影響を参照しません
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionInterceptor transactionInterceptor() {
TransactionInterceptor interceptor = new TransactionInterceptor();
interceptor.setTransactionAttributeSource(transactionAttributeSource());
if (this.txManager != null) {
interceptor.setTransactionManager(this.txManager);
}
return interceptor;
}
- プロパティCallbackPreferringPlatformTransactionManagerを実行するタスクの種類に空ではなく、トランザクションマネージャのCallbackPreferringPlatformTransactionManagerタイプです
- DataSourceTransactionManager、ないCallbackPreferringPlatformTransactionManagerタイプのデフォルトの自動設定。
- トランザクションを作成しようと、createTransactionIfNecessary必要であれば、TM(トランザクションマネージャ)からトランザクション状態TransactionStatusを取得
- トランザクションgetTransaction(すなわち、トランザクション属性)からのトランザクションの定義を取得し、トランザクション状態AbstractPlatformTransactionManager.getTransaction tmを呼び出し親クラスのメソッドを取得します。
- doGetTransactionは現在connectionHolderにバインドするDataSourceTransactionObject(トランザクションインスタンス)を作成します
- トランザクションがあるか否かを決定し、それはtransactionActiveが真であるか否かを判断し、次いで、現在の伝送特性トランザクション状態handleExistingTransactionにカプセル化されたトランザクション・リターンに応じ。
- 転送タイプが_PROPAGATION_NEVERある場合は、例外がスローされます。_IllegalTransactionStateExceptionを(「伝播にマークされたトランザクションが見つかり既存のトランザクション 『決して』」)
- 透過型_PROPAGATION_NOT_SUPPORTED、ブランキングトランザクショントランザクションである、後処理は、現在のトランザクションの完了後に実行した後、次インターセプトに復元された後、現在のトランザクションをサスペンドに結合する結合に対応し、後者は、非トランザクション方式で実行された場合CCN _
- 転送タイプは_PROPAGATION_REQUIRES_NEW、新しいトランザクション_であるならば
- 配信タイプは、ネストされた_PROPAGATION_NESTED_ある場合:あなたはネストされたトランザクション(トランザクションマネージャネストされたトランザクションの春、通常JDBC3.0)を実装するsave_point方法を許可した場合は、セーブポイントを作成し、それ以外の場合は、ネストされたトランザクションを使用して(/ロールバック方法をコミット始める使用します達成JTA)
- 他のタイプの転写後に、新しいトランザクションは、非戻り(即ちnewTransaction =偽)として識別されます
- (「伝播 『必須』とマークされたトランザクションが見つかりません既存のトランザクション」)_IllegalTransactionStateException:なしトランザクション、転送_PROPAGATION_MANDATORY例外がスローされるタイプはありません
- トランザクションと_PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED一方の伝達の欠如、新しいトランザクション_DefaultTransactionStatus、doBegin:falseに設定し、自動的に一連の動作を提出; prepareSynchronization:、トランザクション・マネージャを作成し、同期型トランザクション構成を属性結合、初期化事務の状態に戻り、(主にいくつかの国政ポイントでの同期アクションコールバックのために、新しいトランザクション同期TransactionSynchronizationジェネリックリストを作成します)
- prepareTransactionInfo:(bindToThreadを結合現在のスレッドで、実際には)トランザクション情報を返し、準備ができて、そして現在のスレッドにバインドされたパッケージ取引情報および取引情報などの事務の状態によると、
- すなわち、再帰呼び出しのコールバック・インターセプタ次のノード(又は実際のネストされたトランザクション法)
- cleanupTransactionInfoは現在完了するために、ノードを実行:ノードのトランザクション情報restoreThreadLocalStatusにバインディングを復元します
- 戻り値の完了後インターセプターを返す処理チェーンがcommitTransactionAfterReturning提出行います
- ロールバック・トランザクション処理や状態をコミット
- トランザクションのコミット
- そこ場合save_pointsは、(つまり、提出後にブランクポイントを保存するためにポイントを保存)時点のセーブリリース
- あなたが新しい取引されている場合は、接続に直接アクセス(すべてのノードの記述が傍受されているチェーンの実行が完了している)を提出コミット扱います
- メソッドの戻り値を呼び出し、ターゲットを返します。
- ポスト・アクションのシリーズ:クリア識別と通知コールバックがあれば
概要
- 春二つの方法で実施するためのトランザクションをネストされたが、1ポイントを保存するたびに追加され、一つは終わりのファッションを始める使用することです
- あなたがチェック既存のトランザクションを開いた場合、既存のトランザクション分離レベルを取得し、それぞれが、それはない例外がスローされた場合READONLY属性が一致しない場合IllegalTransactionStateExceptionは、例外が同じスローIllegalTransactionStateExceptionスローされ、親分離レベルと一致しているかどうかを確認します
- あなたが取引の状況を監視したい場合は、同期の通知を管理し、各ノードは、同期インタフェースを介して達成し、マネージャに登録することができTransactionSynchronizationManager