春/ Springbootノートは解決できない理由
現象:春は、特定のトランザクション障害の失敗ノート
理由を:春AOPは、あなたが直接、このプロセスでは、クラスの他の側面を呼び出す場合、プロキシオブジェクト、最初のメソッド呼び出しプロキシオブジェクトを維持するために行われ、意志2回目の呼び出しに主に起因する障害の原因を高めるための別の方法は、コールへのプロキシオブジェクトです。
失敗のサンプルコードの
呼び出し方法は、このような方法は、@Transactional queryUserを失敗した追加されます
@Service
public class UserServiceImpl {
@Transactional
public String queryUser(String userId) {
System.out.println("UserServiceImpl1 ->" + userId);
return "UserServiceImpl1 ->" + userId;
}
@Transactional
public void add(String id) {
queryUser(id);
System.out.println("UserServiceImpl1 -> addxx");
}
}
SpringのAOPは、ばねの重要な部分であるオブジェクトを例に係る動的プロキシであり、特定の処理が必要で強化されるように、動的プロキシによってスプリングを実装し、スプリング・オブジェクトのインスタンス化処理部を有することになります完了後、エージェントの豆動的インスタンス、入口AbstractAutowireCapableBeanFactory applyBeanPostProcessorsAfterInitializationの特定()
このメソッドは、すべての実現BeanPostProcessorインタフェースを横断します
この方法は、このようpostProcessBeforeInstantiation AspectJwareAdvisorAutoProxyCreator(AbstractAutoProxyCreator)クラスの呼び出し
、wrapIfNecessaryこのメソッド呼び出し()(getAdvicesAndAdvisorsForBeanを呼ぶ)、主に、すべてのオブジェクトセクション、及びマッチング部をカプセル化した後、返されたクラスのマッチングされ
、次いで)wrapIfNecessaryに(プロキシオブジェクトに)(createProxyに特定の呼び出しを作成し、この方法は、最初にこの植物は、マルチ実、プロキシ工場に対応したbeanClass、プロキシファクトリプロキシオブジェクトをカプセル化していることに注意してください、プロキシファクトリを作成しますこれは、すべての局面でのプロキシオブジェクトである(この計画の焦点、工場エージェントプロキシオブジェクトの存在である!!!!)、及び、プロキシファクトリを介してプロキシオブジェクトを作成します。
このとき、スプリングは、構成に応じて構成するjdkDynamicAopProxy例にJdkDynamicAopProxy(JDKダイナミックプロキシ)または生成ObjenesisCglibAopProxy(CGLIB剤)、工場でカプセル化されたオブジェクトの二種類があります剤の種類に関係なく、ある:メソッド呼び出しgetProxy 、それはプロキシオブジェクトを返します。プロキシオブジェクトの前後にを呼び出すとJdkDynamicAopProxyの呼び出し()メソッドを移しました。
メソッド呼び出しの焦点を見て:メソッドで呼び出し方法メインシャット見て、第1の方法は、カットがあるかどうかを決定することで、どのようにメソッドのセクションを呼び出すために、春には、我々だけでプロキシ工場にパッケージを入れて、フィルター・チェーン・モデルを使用していますjdkDynamicAopProxyオブジェクト、そして我々はすべてのすべてのプロキシオブジェクトをカットするオブジェクトを介して取得した後、方法の節でこれらが一致し、春のセクションの成功は、オブジェクトのMethodInterceptorの型に拡張パッケージでカットされます一致することができ、なぜパッケージ化すべきですMethodInterceporは、オブジェクトの統一型にパッケージされていない場合、その後のif-else裁判官の多くがあるだろう、5種があるの増加は主のために、それに反対します。完了時()このメソッドgetInterceptorsAndDynamicInterceptionAdvice上記プロセス、主にこのクラスAdvisedSupportで、コールチェーンが呼び出される見出しました。呼び出し()メソッドは、ターゲットオーディエンスオーディエンス法パラメータはReflectiveMethodInvocation型オブジェクトをカプセル化され、コールのタイプ()メソッドを進み、方法は再び切断方法に入ってくる呼び出しの連鎖の形態であろうと、完全に実行するか否かを判断します実行が完了した場合、ターゲットオブジェクトがプロキシオブジェクトであること、対象物との通知をターゲットとする反射法によって呼び出されます!!!
springAOPのソースコードを読むことによって、私たちはなぜ同じアプローチを知って、私たちは別のメソッドを呼び出すための一つの方法である別の方法注釈付きの故障の原因となります。。。自身がソースコードを書いた著者は、およそのファイルに春の動的プロキシクラスの試みの出力に生成されます。
私
mport com.sun.proxy..Proxy50;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.AopConfigException;
public final class userServiceProxy extends Proxy implements Proxy50 {
private static Method m1;
private static Method m31;
private static Method m19;
private static Method m24;
private static Method m18;
private static Method m14;
private static Method m26;
private static Method m32;
private static Method m3;
private static Method m21;
private static Method m7;
private static Method m6;
private static Method m0;
private static Method m28;
private static Method m16;
private static Method m23;
private static Method m30;
private static Method m34;
private static Method m11;
private static Method m2;
private static Method m10;
private static Method m12;
private static Method m20;
private static Method m13;
private static Method m4;
private static Method m5;
private static Method m36;
private static Method m9;
private static Method m17;
private static Method m38;
private static Method m22;
private static Method m33;
private static Method m8;
private static Method m37;
private static Method m35;
private static Method m27;
private static Method m29;
private static Method m25;
private static Method m15;
public userServiceProxy(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final InvocationHandler getInvocationHandler(Object var1) throws IllegalArgumentException {
try {
return (InvocationHandler)super.h.invoke(this, m31, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final void addAdvisor(Advisor var1) throws AopConfigException {
try {
super.h.invoke(this, m19, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final boolean isExposeProxy() throws {
try {
return (Boolean)super.h.invoke(this, m24, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final boolean isProxyTargetClass() throws {
try {
return (Boolean)super.h.invoke(this, m18, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void removeAdvisor(int var1) throws AopConfigException {
try {
super.h.invoke(this, m14, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final Class[] getProxiedInterfaces() throws {
try {
return (Class[])super.h.invoke(this, m26, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final Class getProxyClass(ClassLoader var1, Class[] var2) throws IllegalArgumentException {
try {
return (Class)super.h.invoke(this, m32, new Object[]{var1, var2});
} catch (RuntimeException | Error var4) {
throw var4;
} catch (Throwable var5) {
throw new UndeclaredThrowableException(var5);
}
}
public final int indexOf(Advisor var1) throws {
try {
return (Integer)super.h.invoke(this, m3, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final TargetSource getTargetSource() throws {
try {
return (TargetSource)super.h.invoke(this, m21, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void addAdvice(int var1, Advice var2) throws AopConfigException {
try {
super.h.invoke(this, m7, new Object[]{var1, var2});
} catch (RuntimeException | Error var4) {
throw var4;
} catch (Throwable var5) {
throw new UndeclaredThrowableException(var5);
}
}
public final void addAdvice(Advice var1) throws AopConfigException {
try {
super.h.invoke(this, m6, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final boolean isInterfaceProxied(Class var1) throws {
try {
return (Boolean)super.h.invoke(this, m28, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final boolean removeAdvice(Advice var1) throws {
try {
return (Boolean)super.h.invoke(this, m16, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final void setExposeProxy(boolean var1) throws {
try {
super.h.invoke(this, m23, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final Object newProxyInstance(ClassLoader var1, Class[] var2, InvocationHandler var3) throws IllegalArgumentException {
try {
return (Object)super.h.invoke(this, m30, new Object[]{var1, var2, var3});
} catch (RuntimeException | Error var5) {
throw var5;
} catch (Throwable var6) {
throw new UndeclaredThrowableException(var6);
}
}
public final void wait(long var1, int var3) throws InterruptedException {
try {
super.h.invoke(this, m34, new Object[]{var1, var3});
} catch (RuntimeException | InterruptedException | Error var5) {
throw var5;
} catch (Throwable var6) {
throw new UndeclaredThrowableException(var6);
}
}
public final void setTargetSource(TargetSource var1) throws {
try {
super.h.invoke(this, m11, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final Class getTargetClass() throws {
try {
return (Class)super.h.invoke(this, m10, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final Class getDecoratedClass() throws {
try {
return (Class)super.h.invoke(this, m12, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void addAdvisor(int var1, Advisor var2) throws AopConfigException {
try {
super.h.invoke(this, m20, new Object[]{var1, var2});
} catch (RuntimeException | Error var4) {
throw var4;
} catch (Throwable var5) {
throw new UndeclaredThrowableException(var5);
}
}
public final boolean removeAdvisor(Advisor var1) throws {
try {
return (Boolean)super.h.invoke(this, m13, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final int indexOf(Advice var1) throws {
try {
return (Integer)super.h.invoke(this, m4, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final boolean isFrozen() throws {
try {
return (Boolean)super.h.invoke(this, m5, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final Class getClass() throws {
try {
return (Class)super.h.invoke(this, m36, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void addxx(String var1) throws {
try {
super.h.invoke(this, m9, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final boolean replaceAdvisor(Advisor var1, Advisor var2) throws AopConfigException {
try {
return (Boolean)super.h.invoke(this, m17, new Object[]{var1, var2});
} catch (RuntimeException | Error var4) {
throw var4;
} catch (Throwable var5) {
throw new UndeclaredThrowableException(var5);
}
}
public final void notifyAll() throws {
try {
super.h.invoke(this, m38, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void setPreFiltered(boolean var1) throws {
try {
super.h.invoke(this, m22, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final void wait() throws InterruptedException {
try {
super.h.invoke(this, m33, (Object[])null);
} catch (RuntimeException | InterruptedException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final String queryUser(String var1) throws {
try {
return (String)super.h.invoke(this, m8, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final void notify() throws {
try {
super.h.invoke(this, m37, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void wait(long var1) throws InterruptedException {
try {
super.h.invoke(this, m35, new Object[]{var1});
} catch (RuntimeException | InterruptedException | Error var4) {
throw var4;
} catch (Throwable var5) {
throw new UndeclaredThrowableException(var5);
}
}
public final String toProxyConfigString() throws {
try {
return (String)super.h.invoke(this, m27, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final boolean isProxyClass(Class var1) throws {
try {
return (Boolean)super.h.invoke(this, m29, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final Advisor[] getAdvisors() throws {
try {
return (Advisor[])super.h.invoke(this, m25, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final boolean isPreFiltered() throws {
try {
return (Boolean)super.h.invoke(this, m15, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m31 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getInvocationHandler", Class.forName("java.lang.Object"));
m19 = Class.forName("com.sun.proxy.$Proxy50").getMethod("addAdvisor", Class.forName("org.springframework.aop.Advisor"));
m24 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isExposeProxy");
m18 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isProxyTargetClass");
m14 = Class.forName("com.sun.proxy.$Proxy50").getMethod("removeAdvisor", Integer.TYPE);
m26 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getProxiedInterfaces");
m32 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getProxyClass", Class.forName("java.lang.ClassLoader"), Class.forName("[Ljava.lang.Class;"));
m3 = Class.forName("com.sun.proxy.$Proxy50").getMethod("indexOf", Class.forName("org.springframework.aop.Advisor"));
m21 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getTargetSource");
m7 = Class.forName("com.sun.proxy.$Proxy50").getMethod("addAdvice", Integer.TYPE, Class.forName("org.aopalliance.aop.Advice"));
m6 = Class.forName("com.sun.proxy.$Proxy50").getMethod("addAdvice", Class.forName("org.aopalliance.aop.Advice"));
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
m28 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isInterfaceProxied", Class.forName("java.lang.Class"));
m16 = Class.forName("com.sun.proxy.$Proxy50").getMethod("removeAdvice", Class.forName("org.aopalliance.aop.Advice"));
m23 = Class.forName("com.sun.proxy.$Proxy50").getMethod("setExposeProxy", Boolean.TYPE);
m30 = Class.forName("com.sun.proxy.$Proxy50").getMethod("newProxyInstance", Class.forName("java.lang.ClassLoader"), Class.forName("[Ljava.lang.Class;"), Class.forName("java.lang.reflect.InvocationHandler"));
m34 = Class.forName("com.sun.proxy.$Proxy50").getMethod("wait", Long.TYPE, Integer.TYPE);
m11 = Class.forName("com.sun.proxy.$Proxy50").getMethod("setTargetSource", Class.forName("org.springframework.aop.TargetSource"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m10 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getTargetClass");
m12 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getDecoratedClass");
m20 = Class.forName("com.sun.proxy.$Proxy50").getMethod("addAdvisor", Integer.TYPE, Class.forName("org.springframework.aop.Advisor"));
m13 = Class.forName("com.sun.proxy.$Proxy50").getMethod("removeAdvisor", Class.forName("org.springframework.aop.Advisor"));
m4 = Class.forName("com.sun.proxy.$Proxy50").getMethod("indexOf", Class.forName("org.aopalliance.aop.Advice"));
m5 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isFrozen");
m36 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getClass");
m9 = Class.forName("com.sun.proxy.$Proxy50").getMethod("addxx", Class.forName("java.lang.String"));
m17 = Class.forName("com.sun.proxy.$Proxy50").getMethod("replaceAdvisor", Class.forName("org.springframework.aop.Advisor"), Class.forName("org.springframework.aop.Advisor"));
m38 = Class.forName("com.sun.proxy.$Proxy50").getMethod("notifyAll");
m22 = Class.forName("com.sun.proxy.$Proxy50").getMethod("setPreFiltered", Boolean.TYPE);
m33 = Class.forName("com.sun.proxy.$Proxy50").getMethod("wait");
m8 = Class.forName("com.sun.proxy.$Proxy50").getMethod("queryUser", Class.forName("java.lang.String"));
m37 = Class.forName("com.sun.proxy.$Proxy50").getMethod("notify");
m35 = Class.forName("com.sun.proxy.$Proxy50").getMethod("wait", Long.TYPE);
m27 = Class.forName("com.sun.proxy.$Proxy50").getMethod("toProxyConfigString");
m29 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isProxyClass", Class.forName("java.lang.Class"));
m25 = Class.forName("com.sun.proxy.$Proxy50").getMethod("getAdvisors");
m15 = Class.forName("com.sun.proxy.$Proxy50").getMethod("isPreFiltered");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}
hはJdkDynamicAopProxyタイプをオブジェクトの前に実際には、あなたがh.invoke()メソッドへの最後の呼び出しがある動的プロキシクラスのメソッド呼び出しの生産を見ることができる、あること、h.invokeたちはinvokeメソッドを呼び出す前に呼び出すことで、私たちは直接メソッドを呼び出します強化は有効であるが、このクラスの他の方法は、強化の過程で直接あなたを呼び出すために、我々はRETVAL = invocatin.proceed()メソッドを呼び出すために呼び出しますので、効果的ではなく、メソッドの最終私たちは直接、このクラスの別の方法を対象と注釈の故障につながると呼ばれるように、それは、自分自身のメソッドを呼び出して、最終的にmethod.invke(ターゲット、引数)このコードを実行するために、プロキシオブジェクトを介して呼び出します。我々が強化され、障害が生じ、コールへのオブジェクトではなく、プロキシオブジェクトを呼び出すために、元の最終用途を使用しているため結論として、それがあります。ソリューションは単純で、我々はそれを呼び出すために、プロキシオブジェクトを置き換えます。