From 69c1714dc5d433f047561f6c1b2d6bc777fc5441 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Fri, 10 Nov 2023 18:36:53 +0800 Subject: [PATCH 01/14] fix can't parse FactoryBean with spring --- .../io/seata/spring/annotation/GlobalTransactionScanner.java | 2 ++ .../spring/remoting/parser/RemotingFactoryBeanParser.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java index be1e7533473..d7aeb835ccc 100644 --- a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java +++ b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java @@ -43,6 +43,7 @@ import io.seata.integration.tx.api.interceptor.parser.DefaultInterfaceParser; import io.seata.rm.RMClient; import io.seata.spring.annotation.scannercheckers.PackageScannerChecker; +import io.seata.spring.remoting.parser.RemotingFactoryBeanParser; import io.seata.spring.util.OrderUtil; import io.seata.spring.util.SpringProxyUtils; import io.seata.tm.TMClient; @@ -472,6 +473,7 @@ public void afterPropertiesSet() { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; + RemotingFactoryBeanParser.setApplicationContext(applicationContext); this.setBeanFactory(applicationContext); } diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index 4e5c2ab7cbd..c59d9b120c0 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -81,4 +81,8 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor public short getProtocol() { return 0; } + + public static void setApplicationContext(ApplicationContext applicationContext) { + RemotingFactoryBeanParser.applicationContext = applicationContext; + } } \ No newline at end of file From 3e2bd4448120c18264a7252f5e95561dbd765550 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sat, 11 Nov 2023 14:46:49 +0800 Subject: [PATCH 02/14] use ObjectHolder --- .../io/seata/spring/annotation/GlobalTransactionScanner.java | 2 +- .../spring/remoting/parser/RemotingFactoryBeanParser.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java index d7aeb835ccc..2245bc6b096 100644 --- a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java +++ b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java @@ -473,7 +473,7 @@ public void afterPropertiesSet() { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; - RemotingFactoryBeanParser.setApplicationContext(applicationContext); + ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT, applicationContext); this.setBeanFactory(applicationContext); } diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index c59d9b120c0..0cb42833e5a 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -27,7 +27,7 @@ */ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { - public static ApplicationContext applicationContext; + public static final ApplicationContext APPLICATION_CONTEXT = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); /** * if it is proxy bean, check if the FactoryBean is Remoting bean @@ -82,7 +82,4 @@ public short getProtocol() { return 0; } - public static void setApplicationContext(ApplicationContext applicationContext) { - RemotingFactoryBeanParser.applicationContext = applicationContext; - } } \ No newline at end of file From f3793c207d301b9e80ada1e82ff55461bdfec80c Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sat, 11 Nov 2023 20:43:57 +0800 Subject: [PATCH 03/14] fix can't get actually beanName when bean is proxied --- .../tx/api/interceptor/parser/DefaultInterfaceParser.java | 4 ++-- .../parser/GlobalTransactionalInterceptorParser.java | 2 +- .../tx/api/interceptor/parser/InterfaceParser.java | 2 +- .../main/java/io/seata/integration/tx/api/util/ProxyUtil.java | 2 +- .../parser/GlobalTransactionalInterceptorParserTest.java | 2 +- .../io/seata/spring/annotation/GlobalTransactionScanner.java | 4 +++- .../rm/tcc/interceptor/parser/TccActionInterceptorParser.java | 4 ++-- .../interceptor/parser/TccActionInterceptorParserTest.java | 2 +- 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java index c083965ed62..2b6b930a009 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java @@ -53,9 +53,9 @@ protected void initInterfaceParser() { } @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception { for (InterfaceParser interfaceParser : ALL_INTERFACE_PARSERS) { - ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target); + ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target, targetName); if (proxyInvocationHandler != null) { return proxyInvocationHandler; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java index fd5b6241508..9ddf8865567 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java @@ -46,7 +46,7 @@ public class GlobalTransactionalInterceptorParser implements InterfaceParser { * @see GlobalLock // GlobalLock annotation */ @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception { Class serviceInterface = DefaultTargetClassParser.get().findTargetClass(target); Class[] interfacesIfJdk = DefaultTargetClassParser.get().findInterfaces(target); diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java index 13e283936b3..37efff21e5b 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java @@ -22,7 +22,7 @@ */ public interface InterfaceParser { - ProxyInvocationHandler parserInterfaceToProxy(Object target) throws Exception; + ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java index 8c0f6960518..323eb4c66d6 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java @@ -39,7 +39,7 @@ public static T createProxy(T target) { if (PROXYED_SET.containsKey(target)) { return (T) PROXYED_SET.get(target); } - ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(target); + ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(target, target.getClass().getName()); if (proxyInvocationHandler == null) { return target; } diff --git a/integration-tx-api/src/test/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParserTest.java b/integration-tx-api/src/test/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParserTest.java index e6807a9fc4a..b426b304a32 100644 --- a/integration-tx-api/src/test/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParserTest.java +++ b/integration-tx-api/src/test/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParserTest.java @@ -33,7 +33,7 @@ void parserInterfaceToProxy() throws Exception { GlobalTransactionalInterceptorParser globalTransactionalInterceptorParser = new GlobalTransactionalInterceptorParser(); //when - ProxyInvocationHandler proxyInvocationHandler = globalTransactionalInterceptorParser.parserInterfaceToProxy(business); + ProxyInvocationHandler proxyInvocationHandler = globalTransactionalInterceptorParser.parserInterfaceToProxy(business, business.getClass().getName()); //then Assertions.assertNotNull(proxyInvocationHandler); diff --git a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java index 2245bc6b096..09232765cfc 100644 --- a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java +++ b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; +import io.seata.common.holder.ObjectHolder; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; import io.seata.config.ConfigurationCache; @@ -69,6 +70,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.Ordered; +import static io.seata.common.Constants.OBJECT_KEY_SPRING_APPLICATION_CONTEXT; import static io.seata.common.DefaultValues.DEFAULT_DISABLE_GLOBAL_TRANSACTION; import static io.seata.common.DefaultValues.DEFAULT_TX_GROUP; import static io.seata.common.DefaultValues.DEFAULT_TX_GROUP_OLD; @@ -280,7 +282,7 @@ protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) return bean; } interceptor = null; - ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(bean); + ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(bean, beanName); if (proxyInvocationHandler == null) { return bean; } diff --git a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java index 21434431e90..8b075512853 100644 --- a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java +++ b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java @@ -37,8 +37,8 @@ public class TccActionInterceptorParser implements InterfaceParser { @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target) { - boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, target.toString()); + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) { + boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, targetName); if (isTxRemotingBean) { RemotingDesc remotingDesc = DefaultRemotingParser.get().getRemotingBeanDesc(target); if (remotingDesc != null) { diff --git a/tcc/src/test/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParserTest.java b/tcc/src/test/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParserTest.java index e57dfc7c4f6..1fdac97965c 100644 --- a/tcc/src/test/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParserTest.java +++ b/tcc/src/test/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParserTest.java @@ -33,7 +33,7 @@ void parserInterfaceToProxy() { NormalTccActionImpl tccAction = new NormalTccActionImpl(); //when - ProxyInvocationHandler proxyInvocationHandler = tccActionInterceptorParser.parserInterfaceToProxy(tccAction); + ProxyInvocationHandler proxyInvocationHandler = tccActionInterceptorParser.parserInterfaceToProxy(tccAction, tccAction.getClass().getName()); //then Assertions.assertNotNull(proxyInvocationHandler); From 39391d0ab08456575bb4ff436d117147c161eeae Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sat, 11 Nov 2023 20:44:47 +0800 Subject: [PATCH 04/14] fix recursive call --- .../parser/RemotingFactoryBeanParser.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index 0cb42833e5a..450497ff620 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -16,12 +16,16 @@ package io.seata.spring.remoting.parser; import io.seata.common.exception.FrameworkException; +import io.seata.common.holder.ObjectHolder; import io.seata.integration.tx.api.remoting.RemotingDesc; import io.seata.integration.tx.api.remoting.parser.AbstractedRemotingParser; import io.seata.integration.tx.api.remoting.parser.DefaultRemotingParser; import io.seata.spring.util.SpringProxyUtils; import org.springframework.context.ApplicationContext; +import java.util.HashSet; +import java.util.Set; + /** * @author leezongjie */ @@ -29,6 +33,8 @@ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { public static final ApplicationContext APPLICATION_CONTEXT = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); + private static final Set processedBeanNames = new HashSet<>(); + /** * if it is proxy bean, check if the FactoryBean is Remoting bean * @@ -43,19 +49,30 @@ protected static Object getRemotingFactoryBean(Object bean, String beanName) { //the FactoryBean of proxy bean String factoryBeanName = "&" + beanName; Object factoryBean = null; + checkApplicationContext(); if (applicationContext != null && applicationContext.containsBean(factoryBeanName)) { factoryBean = applicationContext.getBean(factoryBeanName); } return factoryBean; } + private static void checkApplicationContext() { + if (applicationContext == null) { + applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); + } + } @Override public boolean isReference(Object bean, String beanName) { Object factoryBean = getRemotingFactoryBean(bean, beanName); if (factoryBean == null) { return false; } - return DefaultRemotingParser.get().isReference(bean, beanName); + if (onProcessing(beanName)) { + return false; + } + boolean result = DefaultRemotingParser.get().isReference(factoryBean, beanName); + finishProcess(beanName); + return result; } @Override @@ -64,7 +81,12 @@ public boolean isService(Object bean, String beanName) { if (factoryBean == null) { return false; } - return DefaultRemotingParser.get().isReference(bean, beanName); + if (onProcessing(beanName)) { + return false; + } + boolean result = DefaultRemotingParser.get().isService(factoryBean, beanName); + finishProcess(beanName); + return result; } @Override @@ -73,9 +95,29 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor if (factoryBean == null) { return null; } - return DefaultRemotingParser.get().getServiceDesc(bean, beanName); + if (onProcessing(beanName)) { + return null; + } + RemotingDesc remotingDesc = DefaultRemotingParser.get().getServiceDesc(factoryBean, beanName); + finishProcess(beanName); + return remotingDesc; + } + + private boolean onProcessing(String beanName) { + if (processedBeanNames.contains(beanName)) { + return true; + } else { + processedBeanNames.add(beanName); + return false; + } } + private boolean finishProcess(String beanName) { + if (processedBeanNames.contains(beanName)) { + return processedBeanNames.remove(beanName); + } + return true; + } @Override public short getProtocol() { From b3f1002a820935159b65991b45d05a4c33764b0d Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sat, 11 Nov 2023 20:51:48 +0800 Subject: [PATCH 05/14] fix wrong name --- .../remoting/parser/RemotingFactoryBeanParser.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index 450497ff620..4014a150c35 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -31,7 +31,7 @@ */ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { - public static final ApplicationContext APPLICATION_CONTEXT = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); + public static ApplicationContext applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); private static final Set processedBeanNames = new HashSet<>(); @@ -106,17 +106,13 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor private boolean onProcessing(String beanName) { if (processedBeanNames.contains(beanName)) { return true; - } else { - processedBeanNames.add(beanName); - return false; } + processedBeanNames.add(beanName); + return false; } - private boolean finishProcess(String beanName) { - if (processedBeanNames.contains(beanName)) { - return processedBeanNames.remove(beanName); - } - return true; + private void finishProcess(String beanName) { + processedBeanNames.remove(beanName); } @Override From 1eca9c2c9062419476bf503bc397f7559f7a4055 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sat, 11 Nov 2023 21:12:46 +0800 Subject: [PATCH 06/14] fix checkstyle --- .../seata/spring/annotation/GlobalTransactionScanner.java | 1 - .../spring/remoting/parser/RemotingFactoryBeanParser.java | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java index 09232765cfc..8713f25608a 100644 --- a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java +++ b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java @@ -44,7 +44,6 @@ import io.seata.integration.tx.api.interceptor.parser.DefaultInterfaceParser; import io.seata.rm.RMClient; import io.seata.spring.annotation.scannercheckers.PackageScannerChecker; -import io.seata.spring.remoting.parser.RemotingFactoryBeanParser; import io.seata.spring.util.OrderUtil; import io.seata.spring.util.SpringProxyUtils; import io.seata.tm.TMClient; diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index 4014a150c35..f74edbb5bcf 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -33,7 +33,7 @@ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { public static ApplicationContext applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); - private static final Set processedBeanNames = new HashSet<>(); + private static final Set PROCESSED_BEAN_NAMES = new HashSet<>(); /** * if it is proxy bean, check if the FactoryBean is Remoting bean @@ -104,15 +104,15 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor } private boolean onProcessing(String beanName) { - if (processedBeanNames.contains(beanName)) { + if (PROCESSED_BEAN_NAMES.contains(beanName)) { return true; } - processedBeanNames.add(beanName); + PROCESSED_BEAN_NAMES.add(beanName); return false; } private void finishProcess(String beanName) { - processedBeanNames.remove(beanName); + PROCESSED_BEAN_NAMES.remove(beanName); } @Override From 16481d20cdcfe92d19e2cf22455859c7866ea4be Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sun, 12 Nov 2023 10:46:47 +0800 Subject: [PATCH 07/14] Use the appropriate name --- .../tx/api/interceptor/parser/DefaultInterfaceParser.java | 4 ++-- .../parser/GlobalTransactionalInterceptorParser.java | 2 +- .../tx/api/interceptor/parser/InterfaceParser.java | 2 +- .../java/io/seata/integration/tx/api/util/ProxyUtil.java | 6 +++++- .../java/io/seata/spring/tcc/TccAnnotationProcessor.java | 2 +- .../tcc/interceptor/parser/TccActionInterceptorParser.java | 4 ++-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java index 2b6b930a009..16fc0d63346 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java @@ -53,9 +53,9 @@ protected void initInterfaceParser() { } @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception { for (InterfaceParser interfaceParser : ALL_INTERFACE_PARSERS) { - ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target, targetName); + ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target, beanName); if (proxyInvocationHandler != null) { return proxyInvocationHandler; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java index 9ddf8865567..3ca73978bd1 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java @@ -46,7 +46,7 @@ public class GlobalTransactionalInterceptorParser implements InterfaceParser { * @see GlobalLock // GlobalLock annotation */ @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception { Class serviceInterface = DefaultTargetClassParser.get().findTargetClass(target); Class[] interfacesIfJdk = DefaultTargetClassParser.get().findInterfaces(target); diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java index 37efff21e5b..fd39ca3fb6a 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java @@ -22,7 +22,7 @@ */ public interface InterfaceParser { - ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) throws Exception; + ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java index 323eb4c66d6..2ed74da1f69 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/util/ProxyUtil.java @@ -34,12 +34,16 @@ public class ProxyUtil { private static final Map PROXYED_SET = new HashMap<>(); public static T createProxy(T target) { + return createProxy(target, target.getClass().getName()); + } + + public static T createProxy(T target, String beanName) { try { synchronized (PROXYED_SET) { if (PROXYED_SET.containsKey(target)) { return (T) PROXYED_SET.get(target); } - ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(target, target.getClass().getName()); + ProxyInvocationHandler proxyInvocationHandler = DefaultInterfaceParser.get().parserInterfaceToProxy(target, beanName); if (proxyInvocationHandler == null) { return target; } diff --git a/spring/src/main/java/io/seata/spring/tcc/TccAnnotationProcessor.java b/spring/src/main/java/io/seata/spring/tcc/TccAnnotationProcessor.java index 130e3cad82e..2eb5acb8430 100644 --- a/spring/src/main/java/io/seata/spring/tcc/TccAnnotationProcessor.java +++ b/spring/src/main/java/io/seata/spring/tcc/TccAnnotationProcessor.java @@ -103,7 +103,7 @@ public void addTccAdvise(Object bean, String beanName, Field field, Class servic RemotingDesc remotingDesc = new RemotingDesc(); remotingDesc.setServiceClass(serviceClass); - Object proxyBean = ProxyUtil.createProxy(bean); + Object proxyBean = ProxyUtil.createProxy(bean, beanName); field.setAccessible(true); field.set(bean, proxyBean); LOGGER.info("Bean[" + bean.getClass().getName() + "] with name [" + field.getName() + "] would use proxy"); diff --git a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java index 8b075512853..ba37748933a 100644 --- a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java +++ b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java @@ -37,8 +37,8 @@ public class TccActionInterceptorParser implements InterfaceParser { @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String targetName) { - boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, targetName); + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) { + boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, beanName); if (isTxRemotingBean) { RemotingDesc remotingDesc = DefaultRemotingParser.get().getRemotingBeanDesc(target); if (remotingDesc != null) { From 432b7bfa0c6c19d3226888960cddcb9d28de9b13 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Sun, 12 Nov 2023 11:08:54 +0800 Subject: [PATCH 08/14] simplify code --- .../parser/RemotingFactoryBeanParser.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index f74edbb5bcf..d6cf08b7a82 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -23,8 +23,9 @@ import io.seata.spring.util.SpringProxyUtils; import org.springframework.context.ApplicationContext; -import java.util.HashSet; +import java.util.Collections; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * @author leezongjie @@ -33,7 +34,9 @@ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { public static ApplicationContext applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); - private static final Set PROCESSED_BEAN_NAMES = new HashSet<>(); + /** Names of beans that are currently in process. */ + private final Set beansCurrentlyInProcess = + Collections.newSetFromMap(new ConcurrentHashMap<>(16)); /** * if it is proxy bean, check if the FactoryBean is Remoting bean @@ -67,11 +70,11 @@ public boolean isReference(Object bean, String beanName) { if (factoryBean == null) { return false; } - if (onProcessing(beanName)) { + if (beforeRemainParserProcess(beanName)) { return false; } boolean result = DefaultRemotingParser.get().isReference(factoryBean, beanName); - finishProcess(beanName); + afterRemainParserProcess(beanName); return result; } @@ -81,11 +84,11 @@ public boolean isService(Object bean, String beanName) { if (factoryBean == null) { return false; } - if (onProcessing(beanName)) { + if (beforeRemainParserProcess(beanName)) { return false; } boolean result = DefaultRemotingParser.get().isService(factoryBean, beanName); - finishProcess(beanName); + afterRemainParserProcess(beanName); return result; } @@ -95,24 +98,20 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor if (factoryBean == null) { return null; } - if (onProcessing(beanName)) { + if (beforeRemainParserProcess(beanName)) { return null; } RemotingDesc remotingDesc = DefaultRemotingParser.get().getServiceDesc(factoryBean, beanName); - finishProcess(beanName); + afterRemainParserProcess(beanName); return remotingDesc; } - private boolean onProcessing(String beanName) { - if (PROCESSED_BEAN_NAMES.contains(beanName)) { - return true; - } - PROCESSED_BEAN_NAMES.add(beanName); - return false; + private boolean beforeRemainParserProcess(String beanName) { + return !beansCurrentlyInProcess.add(beanName); } - private void finishProcess(String beanName) { - PROCESSED_BEAN_NAMES.remove(beanName); + private void afterRemainParserProcess(String beanName) { + beansCurrentlyInProcess.remove(beanName); } @Override From b699d93c78899b1772f9e96d2ce4f6654de3782e Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Mon, 13 Nov 2023 11:11:46 +0800 Subject: [PATCH 09/14] get actually beanName --- .../api/interceptor/parser/DefaultResourceRegisterParser.java | 4 ++-- .../tx/api/interceptor/parser/RegisterResourceParser.java | 2 +- .../rm/tcc/interceptor/parser/TccActionInterceptorParser.java | 2 +- .../rm/tcc/resource/parser/TccRegisterResourceParser.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultResourceRegisterParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultResourceRegisterParser.java index eb6294a0f71..2bce82a34b0 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultResourceRegisterParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultResourceRegisterParser.java @@ -28,9 +28,9 @@ public class DefaultResourceRegisterParser { protected static List allRegisterResourceParsers = new ArrayList<>(); - public void registerResource(Object target) { + public void registerResource(Object target, String beanName) { for (RegisterResourceParser registerResourceParser : allRegisterResourceParsers) { - registerResourceParser.registerResource(target); + registerResourceParser.registerResource(target, beanName); } } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/RegisterResourceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/RegisterResourceParser.java index bd749628ead..1f84ccc3ef3 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/RegisterResourceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/RegisterResourceParser.java @@ -20,6 +20,6 @@ */ public interface RegisterResourceParser { - void registerResource(Object target); + void registerResource(Object target, String beanName); } diff --git a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java index ba37748933a..c6ed8f90599 100644 --- a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java +++ b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java @@ -43,7 +43,7 @@ public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanN RemotingDesc remotingDesc = DefaultRemotingParser.get().getRemotingBeanDesc(target); if (remotingDesc != null) { if (remotingDesc.isService()) { - DefaultResourceRegisterParser.get().registerResource(target); + DefaultResourceRegisterParser.get().registerResource(target, beanName); } if (remotingDesc.isReference()) { //if it is a tcc remote reference diff --git a/tcc/src/main/java/io/seata/rm/tcc/resource/parser/TccRegisterResourceParser.java b/tcc/src/main/java/io/seata/rm/tcc/resource/parser/TccRegisterResourceParser.java index f12fc2dedfa..fe99db93304 100644 --- a/tcc/src/main/java/io/seata/rm/tcc/resource/parser/TccRegisterResourceParser.java +++ b/tcc/src/main/java/io/seata/rm/tcc/resource/parser/TccRegisterResourceParser.java @@ -41,8 +41,8 @@ public class TccRegisterResourceParser implements RegisterResourceParser { @Override - public void registerResource(Object target) { - boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, target.toString()); + public void registerResource(Object target, String beanName) { + boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, beanName); if (isTxRemotingBean) { RemotingDesc remotingDesc = DefaultRemotingParser.get().getRemotingBeanDesc(target); if (remotingDesc != null) { From 50f5a3b7b0bbe027728221f3623ab0d1cba8bdd5 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Mon, 13 Nov 2023 22:17:19 +0800 Subject: [PATCH 10/14] use beanFactoryName break loop --- .../parser/DefaultRemotingParser.java | 3 ++ .../annotation/GlobalTransactionScanner.java | 7 +-- .../parser/RemotingFactoryBeanParser.java | 53 ++++--------------- ...integration.tx.api.remoting.RemotingParser | 1 - 4 files changed, 18 insertions(+), 46 deletions(-) delete mode 100644 spring/src/main/resources/META-INF/services/io.seata.integration.tx.api.remoting.RemotingParser diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java index 5b3a28baf94..c1a6e0bb4b7 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java @@ -75,6 +75,9 @@ protected void initRemotingParser() { } } + public void registerRemotingParser(RemotingParser remotingParser) { + allRemotingParsers.add(remotingParser); + } /** * is remoting bean ? * diff --git a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java index 8713f25608a..e51365dcb4b 100644 --- a/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java +++ b/spring/src/main/java/io/seata/spring/annotation/GlobalTransactionScanner.java @@ -24,7 +24,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; -import io.seata.common.holder.ObjectHolder; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; import io.seata.config.ConfigurationCache; @@ -42,8 +41,10 @@ import io.seata.integration.tx.api.interceptor.handler.GlobalTransactionalInterceptorHandler; import io.seata.integration.tx.api.interceptor.handler.ProxyInvocationHandler; import io.seata.integration.tx.api.interceptor.parser.DefaultInterfaceParser; +import io.seata.integration.tx.api.remoting.parser.DefaultRemotingParser; import io.seata.rm.RMClient; import io.seata.spring.annotation.scannercheckers.PackageScannerChecker; +import io.seata.spring.remoting.parser.RemotingFactoryBeanParser; import io.seata.spring.util.OrderUtil; import io.seata.spring.util.SpringProxyUtils; import io.seata.tm.TMClient; @@ -69,7 +70,6 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.Ordered; -import static io.seata.common.Constants.OBJECT_KEY_SPRING_APPLICATION_CONTEXT; import static io.seata.common.DefaultValues.DEFAULT_DISABLE_GLOBAL_TRANSACTION; import static io.seata.common.DefaultValues.DEFAULT_TX_GROUP; import static io.seata.common.DefaultValues.DEFAULT_TX_GROUP_OLD; @@ -474,7 +474,8 @@ public void afterPropertiesSet() { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; - ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT, applicationContext); + RemotingFactoryBeanParser remotingFactoryBeanParser = new RemotingFactoryBeanParser(applicationContext); + DefaultRemotingParser.get().registerRemotingParser(remotingFactoryBeanParser); this.setBeanFactory(applicationContext); } diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index d6cf08b7a82..84c3e9dfa9c 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -16,27 +16,22 @@ package io.seata.spring.remoting.parser; import io.seata.common.exception.FrameworkException; -import io.seata.common.holder.ObjectHolder; import io.seata.integration.tx.api.remoting.RemotingDesc; import io.seata.integration.tx.api.remoting.parser.AbstractedRemotingParser; import io.seata.integration.tx.api.remoting.parser.DefaultRemotingParser; import io.seata.spring.util.SpringProxyUtils; import org.springframework.context.ApplicationContext; -import java.util.Collections; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - /** * @author leezongjie */ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { - public static ApplicationContext applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); + public ApplicationContext applicationContext; - /** Names of beans that are currently in process. */ - private final Set beansCurrentlyInProcess = - Collections.newSetFromMap(new ConcurrentHashMap<>(16)); + public RemotingFactoryBeanParser(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } /** * if it is proxy bean, check if the FactoryBean is Remoting bean @@ -45,37 +40,27 @@ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { * @param beanName the bean name * @return boolean boolean */ - protected static Object getRemotingFactoryBean(Object bean, String beanName) { + protected Object getRemotingFactoryBean(Object bean, String beanName) { if (!SpringProxyUtils.isProxy(bean)) { return null; } //the FactoryBean of proxy bean String factoryBeanName = "&" + beanName; Object factoryBean = null; - checkApplicationContext(); if (applicationContext != null && applicationContext.containsBean(factoryBeanName)) { factoryBean = applicationContext.getBean(factoryBeanName); } return factoryBean; } - private static void checkApplicationContext() { - if (applicationContext == null) { - applicationContext = ObjectHolder.INSTANCE.getObject(ApplicationContext.class); - } - } @Override public boolean isReference(Object bean, String beanName) { Object factoryBean = getRemotingFactoryBean(bean, beanName); if (factoryBean == null) { return false; } - if (beforeRemainParserProcess(beanName)) { - return false; - } - boolean result = DefaultRemotingParser.get().isReference(factoryBean, beanName); - afterRemainParserProcess(beanName); - return result; + String factoryBeanName = "&" + beanName; + return DefaultRemotingParser.get().isReference(factoryBean, factoryBeanName); } @Override @@ -84,12 +69,8 @@ public boolean isService(Object bean, String beanName) { if (factoryBean == null) { return false; } - if (beforeRemainParserProcess(beanName)) { - return false; - } - boolean result = DefaultRemotingParser.get().isService(factoryBean, beanName); - afterRemainParserProcess(beanName); - return result; + String factoryBeanName = "&" + beanName; + return DefaultRemotingParser.get().isService(factoryBean, factoryBeanName); } @Override @@ -98,20 +79,8 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor if (factoryBean == null) { return null; } - if (beforeRemainParserProcess(beanName)) { - return null; - } - RemotingDesc remotingDesc = DefaultRemotingParser.get().getServiceDesc(factoryBean, beanName); - afterRemainParserProcess(beanName); - return remotingDesc; - } - - private boolean beforeRemainParserProcess(String beanName) { - return !beansCurrentlyInProcess.add(beanName); - } - - private void afterRemainParserProcess(String beanName) { - beansCurrentlyInProcess.remove(beanName); + String factoryBeanName = "&" + beanName; + return DefaultRemotingParser.get().getServiceDesc(factoryBean, factoryBeanName); } @Override diff --git a/spring/src/main/resources/META-INF/services/io.seata.integration.tx.api.remoting.RemotingParser b/spring/src/main/resources/META-INF/services/io.seata.integration.tx.api.remoting.RemotingParser deleted file mode 100644 index 3de6f0e864d..00000000000 --- a/spring/src/main/resources/META-INF/services/io.seata.integration.tx.api.remoting.RemotingParser +++ /dev/null @@ -1 +0,0 @@ -io.seata.spring.remoting.parser.RemotingFactoryBeanParser \ No newline at end of file From 4b97db7d7dfd3cfba48cb71ff71545c84589d960 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Mon, 13 Nov 2023 22:22:11 +0800 Subject: [PATCH 11/14] add comment --- .../tx/api/remoting/parser/DefaultRemotingParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java index c1a6e0bb4b7..c5b03ee8a98 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java @@ -75,6 +75,10 @@ protected void initRemotingParser() { } } + /** + * register custom remoting parser + * @param remotingParser + */ public void registerRemotingParser(RemotingParser remotingParser) { allRemotingParsers.add(remotingParser); } From be75f7bde08867b7ec4d09797086686e14d5c511 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Tue, 14 Nov 2023 09:36:03 +0800 Subject: [PATCH 12/14] add changes and author --- changes/en-us/2.0.0.md | 2 ++ changes/zh-cn/2.0.0.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/changes/en-us/2.0.0.md b/changes/en-us/2.0.0.md index fc8b106af16..49ee6f02f5d 100644 --- a/changes/en-us/2.0.0.md +++ b/changes/en-us/2.0.0.md @@ -87,6 +87,7 @@ The version is updated as follows: - [[#5887](https://github.com/seata/seata/pull/5887)] fix global transaction hook repeat execute - [[#6018](https://github.com/seata/seata/pull/6018)] fix incorrect metric report - [[#6024](https://github.com/seata/seata/pull/6024)] fix the white screen after click the "View Global Lock" button on the transaction info page in the console +- [[#6015](https://github.com/seata/seata/pull/6015)] fix can't integrate dubbo with spring ### optimize: - [[#5966](https://github.com/seata/seata/pull/5966)] decouple saga expression handling and remove evaluator package @@ -219,6 +220,7 @@ Thanks to these contributors for their code commits. Please report an unintended - [Aruato](https://github.com/Aruato) - [ptyin](https://github.com/ptyin) - [jsbxyyx](https://github.com/jsbxyyx) +- [xxxcrel](https://github.com/xxxcrel) Also, we receive many valuable issues, questions and advices from our community. Thanks for you all. diff --git a/changes/zh-cn/2.0.0.md b/changes/zh-cn/2.0.0.md index bb9c22850e2..73012f63a0d 100644 --- a/changes/zh-cn/2.0.0.md +++ b/changes/zh-cn/2.0.0.md @@ -86,6 +86,7 @@ Seata 是一款开源的分布式事务解决方案,提供高性能和简单 - [[#5887](https://github.com/seata/seata/pull/5887)] 修复全局事务钩子重复执行 - [[#6018](https://github.com/seata/seata/pull/6018)] 修复错误的 metric 上报 - [[#6024](https://github.com/seata/seata/pull/6024)] 修复控制台点击事务信息页面中的"查看全局锁"按钮之后白屏的问题 +- [[#6015](https://github.com/seata/seata/pull/6015)] 修复在spring环境下无法集成dubbo ### optimize: @@ -221,6 +222,7 @@ Seata 是一款开源的分布式事务解决方案,提供高性能和简单 - [ggbocoder](https://github.com/ggbocoder) - [ptyin](https://github.com/ptyin) - [jsbxyyx](https://github.com/jsbxyyx) +- [xxxcrel](https://github.com/xxxcrel) From dc70321e185a35e66988d77981ecfb3146bd4945 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Tue, 14 Nov 2023 11:11:07 +0800 Subject: [PATCH 13/14] optimize code --- .../parser/DefaultInterfaceParser.java | 4 ++-- .../GlobalTransactionalInterceptorParser.java | 2 +- .../interceptor/parser/InterfaceParser.java | 2 +- .../parser/DefaultRemotingParser.java | 7 +++++-- .../parser/RemotingFactoryBeanParser.java | 19 +++++++++++-------- .../parser/TccActionInterceptorParser.java | 6 +++--- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java index 16fc0d63346..f07799dae0a 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/DefaultInterfaceParser.java @@ -53,9 +53,9 @@ protected void initInterfaceParser() { } @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String objectName) throws Exception { for (InterfaceParser interfaceParser : ALL_INTERFACE_PARSERS) { - ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target, beanName); + ProxyInvocationHandler proxyInvocationHandler = interfaceParser.parserInterfaceToProxy(target, objectName); if (proxyInvocationHandler != null) { return proxyInvocationHandler; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java index 3ca73978bd1..6e879dd7dea 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/GlobalTransactionalInterceptorParser.java @@ -46,7 +46,7 @@ public class GlobalTransactionalInterceptorParser implements InterfaceParser { * @see GlobalLock // GlobalLock annotation */ @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception { + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String objectName) throws Exception { Class serviceInterface = DefaultTargetClassParser.get().findTargetClass(target); Class[] interfacesIfJdk = DefaultTargetClassParser.get().findInterfaces(target); diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java index fd39ca3fb6a..c0889680cf5 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java @@ -22,7 +22,7 @@ */ public interface InterfaceParser { - ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) throws Exception; + ProxyInvocationHandler parserInterfaceToProxy(Object target, String ObjectName) throws Exception; } diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java index c5b03ee8a98..cb635612a18 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/remoting/parser/DefaultRemotingParser.java @@ -79,9 +79,12 @@ protected void initRemotingParser() { * register custom remoting parser * @param remotingParser */ - public void registerRemotingParser(RemotingParser remotingParser) { - allRemotingParsers.add(remotingParser); + public boolean registerRemotingParser(RemotingParser remotingParser) { + synchronized (this) { + return allRemotingParsers.add(remotingParser); + } } + /** * is remoting bean ? * diff --git a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java index 84c3e9dfa9c..f077149d950 100644 --- a/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java +++ b/spring/src/main/java/io/seata/spring/remoting/parser/RemotingFactoryBeanParser.java @@ -21,6 +21,7 @@ import io.seata.integration.tx.api.remoting.parser.DefaultRemotingParser; import io.seata.spring.util.SpringProxyUtils; import org.springframework.context.ApplicationContext; +import org.springframework.util.Assert; /** * @author leezongjie @@ -30,6 +31,7 @@ public class RemotingFactoryBeanParser extends AbstractedRemotingParser { public ApplicationContext applicationContext; public RemotingFactoryBeanParser(ApplicationContext applicationContext) { + Assert.notNull(applicationContext, "applicationContext must not be null"); this.applicationContext = applicationContext; } @@ -45,9 +47,9 @@ protected Object getRemotingFactoryBean(Object bean, String beanName) { return null; } //the FactoryBean of proxy bean - String factoryBeanName = "&" + beanName; + String factoryBeanName = getFactoryBeanName(beanName); Object factoryBean = null; - if (applicationContext != null && applicationContext.containsBean(factoryBeanName)) { + if (applicationContext.containsBean(factoryBeanName)) { factoryBean = applicationContext.getBean(factoryBeanName); } return factoryBean; @@ -59,8 +61,7 @@ public boolean isReference(Object bean, String beanName) { if (factoryBean == null) { return false; } - String factoryBeanName = "&" + beanName; - return DefaultRemotingParser.get().isReference(factoryBean, factoryBeanName); + return DefaultRemotingParser.get().isReference(factoryBean, getFactoryBeanName(beanName)); } @Override @@ -69,8 +70,7 @@ public boolean isService(Object bean, String beanName) { if (factoryBean == null) { return false; } - String factoryBeanName = "&" + beanName; - return DefaultRemotingParser.get().isService(factoryBean, factoryBeanName); + return DefaultRemotingParser.get().isService(factoryBean, getFactoryBeanName(beanName)); } @Override @@ -79,8 +79,11 @@ public RemotingDesc getServiceDesc(Object bean, String beanName) throws Framewor if (factoryBean == null) { return null; } - String factoryBeanName = "&" + beanName; - return DefaultRemotingParser.get().getServiceDesc(factoryBean, factoryBeanName); + return DefaultRemotingParser.get().getServiceDesc(factoryBean, getFactoryBeanName(beanName)); + } + + private String getFactoryBeanName(String beanName) { + return "&" + beanName; } @Override diff --git a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java index c6ed8f90599..c6ef74fde6e 100644 --- a/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java +++ b/tcc/src/main/java/io/seata/rm/tcc/interceptor/parser/TccActionInterceptorParser.java @@ -37,13 +37,13 @@ public class TccActionInterceptorParser implements InterfaceParser { @Override - public ProxyInvocationHandler parserInterfaceToProxy(Object target, String beanName) { - boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, beanName); + public ProxyInvocationHandler parserInterfaceToProxy(Object target, String objectName) { + boolean isTxRemotingBean = TxBeanParserUtils.isTxRemotingBean(target, objectName); if (isTxRemotingBean) { RemotingDesc remotingDesc = DefaultRemotingParser.get().getRemotingBeanDesc(target); if (remotingDesc != null) { if (remotingDesc.isService()) { - DefaultResourceRegisterParser.get().registerResource(target, beanName); + DefaultResourceRegisterParser.get().registerResource(target, objectName); } if (remotingDesc.isReference()) { //if it is a tcc remote reference From 770b77da71767d01bd555cb6b886a89625f50669 Mon Sep 17 00:00:00 2001 From: xxxcrel Date: Tue, 14 Nov 2023 11:33:51 +0800 Subject: [PATCH 14/14] fix checkstyle --- .../integration/tx/api/interceptor/parser/InterfaceParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java index c0889680cf5..18c30df3a34 100644 --- a/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java +++ b/integration-tx-api/src/main/java/io/seata/integration/tx/api/interceptor/parser/InterfaceParser.java @@ -22,7 +22,7 @@ */ public interface InterfaceParser { - ProxyInvocationHandler parserInterfaceToProxy(Object target, String ObjectName) throws Exception; + ProxyInvocationHandler parserInterfaceToProxy(Object target, String objectName) throws Exception; }