diff --git a/pom.xml b/pom.xml
index 1adeb6a5c3d0d970b21849d9f58b2b2726d2117b..b08ed89addbb69f9058d34dcab23d952b1e0d011 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,7 @@
sdk-springboot
sdk-context
sdk-examples
+ sdk-springboot3
pom
@@ -27,6 +28,7 @@
3.8.1
2.7.11
+ 3.2.5
2.3.23
31.1-jre
1.61.0
@@ -256,18 +258,6 @@
maven-compiler-plugin
${maven.plugin.version}
-
- org.springframework.boot
- spring-boot
- ${spring.boot.version}
- provided
-
-
- org.springframework.boot
- spring-boot-autoconfigure
- ${spring.boot.version}
- provided
-
org.slf4j
diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml
index 8d51de30679a449c18fbecde2ab49c1f23bb0f70..457822175af8d6805263da3e23b04a9a4ae7c8ef 100644
--- a/sdk-springboot/pom.xml
+++ b/sdk-springboot/pom.xml
@@ -31,11 +31,14 @@
org.springframework.boot
spring-boot
+ ${spring.boot.version}
org.springframework.boot
spring-boot-autoconfigure
+ ${spring.boot.version}
+
diff --git a/sdk-springboot3/pom.xml b/sdk-springboot3/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..36e824c2dbad9a79a5cb51a1883d2855400e9ac7
--- /dev/null
+++ b/sdk-springboot3/pom.xml
@@ -0,0 +1,101 @@
+
+
+
+ io.openkunlun
+ sdk-java
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ sdk-springboot3
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.22
+ provided
+
+
+ javax.annotation
+ javax.annotation-api
+ provided
+
+
+ ${project.groupId}
+ sdk-java-rpc
+ ${project.version}
+
+
+
+ org.springframework.boot
+ spring-boot
+ ${spring.boot3.version}
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ ${spring.boot3.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 17
+ 17
+ UTF-8
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ **/log4j.xml
+ **/log4j2.xml
+ **/logback.xml
+ **/*.yml
+ **/*.yaml
+ **/*.conf
+ **/*.properties
+ **/META-INF/*.xml
+
+
+ false
+ false
+
+ true
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprClient.java b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac9f0ccc5466dd7d54bd29f4b926dc447150958f
--- /dev/null
+++ b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprClient.java
@@ -0,0 +1,19 @@
+package io.openkunlun.javadsl.springboot3;
+
+import io.openkunlun.javadsl.springboot3.client.DaprClientConfigurator;
+import io.openkunlun.javadsl.springboot3.client.DaprStubRegistrar;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+@Import({DaprStubRegistrar.class, DaprClientConfigurator.class})
+public @interface EnableDaprClient {
+
+ /**
+ * @return
+ */
+ String[] basePackages() default {};
+}
diff --git a/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprServer.java b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..b17f7de3c095c60de208d5b0855448c585c033fc
--- /dev/null
+++ b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/EnableDaprServer.java
@@ -0,0 +1,22 @@
+package io.openkunlun.javadsl.springboot3;
+
+import io.openkunlun.javadsl.springboot3.client.DaprClientConfigurator;
+import io.openkunlun.javadsl.springboot3.server.DaprFailureDetectorRegistrar;
+import io.openkunlun.javadsl.springboot3.server.DaprHandlerRegistrar;
+import io.openkunlun.javadsl.springboot3.server.DaprResolverRegistrar;
+import io.openkunlun.javadsl.springboot3.server.DaprServerConfigurator;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+@Import({DaprHandlerRegistrar.class, DaprResolverRegistrar.class, DaprFailureDetectorRegistrar.class, DaprClientConfigurator.class, DaprServerConfigurator.class})
+public @interface EnableDaprServer {
+
+ /**
+ * @return
+ */
+ String[] basePackages() default {};
+}
diff --git a/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientConfigurator.java b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientConfigurator.java
new file mode 100644
index 0000000000000000000000000000000000000000..83eaf26a7c2afdbe02b22e1eadd0262519641524
--- /dev/null
+++ b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientConfigurator.java
@@ -0,0 +1,42 @@
+package io.openkunlun.javadsl.springboot3.client;
+
+import io.openkunlun.javadsl.client.DaprClient;
+import io.openkunlun.javadsl.serialization.DaprSerializer;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Role;
+
+import javax.annotation.Resource;
+
+@Configuration
+@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+@EnableConfigurationProperties(DaprClientProperties.class)
+public class DaprClientConfigurator {
+
+ @Resource
+ private DaprClientProperties properties;
+
+ @Lazy
+ @Bean(destroyMethod = "close")
+ @ConditionalOnMissingBean(DaprClient.class)
+ DaprClient client() {
+ return new DaprClient(
+ properties.getHost(),
+ properties.getPort(),
+ properties.getTimeout(),
+ properties.getMaxMessageBytes(),
+ properties.getMaxMetadataBytes()
+ );
+ }
+
+ @Lazy
+ @Bean
+ @ConditionalOnMissingBean(DaprSerializer.class)
+ DaprSerializer serializer() {
+ return DaprSerializer.CBOR;
+ }
+}
diff --git a/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientProperties.java b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..5943ddd118b3931e901d3ed0ca7d611904445e4c
--- /dev/null
+++ b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprClientProperties.java
@@ -0,0 +1,18 @@
+package io.openkunlun.javadsl.springboot3.client;
+
+import io.openkunlun.javadsl.client.DaprClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "dapr.client")
+public class DaprClientProperties {
+
+ private String host = DaprClient.DEFAULT_HOST;
+ private int port = DaprClient.DEFAULT_PORT;
+ private int timeout = DaprClient.DEFAULT_TIMEOUT;
+
+ private int maxMessageBytes = DaprClient.DEFAULT_MAX_MESSAGE_BYTES;
+ private int maxMetadataBytes = DaprClient.DEFAULT_MAX_METADATA_BYTES;
+
+}
diff --git a/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprStubFactoryBean.java b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprStubFactoryBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..0200f4f8013048c867b7f24939acc546d19eb7e2
--- /dev/null
+++ b/sdk-springboot3/src/main/java/io/openkunlun/javadsl/springboot3/client/DaprStubFactoryBean.java
@@ -0,0 +1,41 @@
+package io.openkunlun.javadsl.springboot3.client;
+
+import io.openkunlun.javarpc.RpcStub;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DaprStubFactoryBean implements FactoryBean, ApplicationContextAware {
+
+ private final Class type;
+ private final List> fields;
+ private ApplicationContext applicationContext;
+
+ public DaprStubFactoryBean(Class type, List> fields) {
+ this.type = type;
+ this.fields = fields;
+ }
+
+ @Override
+ public RpcStub getObject() throws Exception {
+ List