doScan(String... basePackages) {
+ return super.doScan(basePackages);
+ }
+
+ @Override
+ public boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException {
+ return super.checkCandidate(beanName, beanDefinition);
+ }
+
+}
\ No newline at end of file
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java
new file mode 100644
index 00000000..357fd2d6
--- /dev/null
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java
@@ -0,0 +1,42 @@
+package io.kimmking.rpcfx.api.annotation;
+
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Import(RpcfxComponentScanRegistrar.class)
+public @interface RpcfxComponentScan {
+
+ /**
+ * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation
+ * declarations e.g.: {@code @DubboComponentScan("org.my.pkg")} instead of
+ * {@code @DubboComponentScan(basePackages="org.my.pkg")}.
+ *
+ * @return the base packages to scan
+ */
+ String[] value() default {};
+
+ /**
+ * Base packages to scan for annotated @Service classes. {@link #value()} is an
+ * alias for (and mutually exclusive with) this attribute.
+ *
+ * Use {@link #basePackageClasses()} for a type-safe alternative to String-based
+ * package names.
+ *
+ * @return the base packages to scan
+ */
+ String[] basePackages() default {};
+
+ /**
+ * Type-safe alternative to {@link #basePackages()} for specifying the packages to
+ * scan for annotated @Service classes. The package of each class specified will be
+ * scanned.
+ *
+ * @return classes from the base packages to scan
+ */
+ Class>[] basePackageClasses() default {};
+
+}
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java
new file mode 100644
index 00000000..6ecd8090
--- /dev/null
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java
@@ -0,0 +1,60 @@
+package io.kimmking.rpcfx.api.annotation;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
+import org.springframework.core.annotation.AnnotationAttributes;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.util.ClassUtils;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
+
+public class RpcfxComponentScanRegistrar implements ImportBeanDefinitionRegistrar {
+
+ @Override
+ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
+
+ Set packagesToScan = getPackagesToScan(importingClassMetadata);
+
+ registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
+
+ //registerCommonBeans(registry);
+ }
+
+ private void registerServiceAnnotationBeanPostProcessor(Set packagesToScan, BeanDefinitionRegistry registry) {
+
+ BeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class);
+ builder.addConstructorArgValue(packagesToScan);
+ builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
+ AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
+ BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);
+
+ }
+
+ private Set getPackagesToScan(AnnotationMetadata metadata) {
+ AnnotationAttributes attributes = AnnotationAttributes.fromMap(
+ metadata.getAnnotationAttributes(RpcfxComponentScan.class.getName()));
+ String[] basePackages = attributes.getStringArray("basePackages");
+ Class>[] basePackageClasses = attributes.getClassArray("basePackageClasses");
+ String[] value = attributes.getStringArray("value");
+ // Appends value array attributes
+ Set packagesToScan = new LinkedHashSet(Arrays.asList(value));
+ packagesToScan.addAll(Arrays.asList(basePackages));
+ for (Class> basePackageClass : basePackageClasses) {
+ packagesToScan.add(ClassUtils.getPackageName(basePackageClass));
+ }
+ if (packagesToScan.isEmpty()) {
+ return Collections.singleton(ClassUtils.getPackageName(metadata.getClassName()));
+ }
+ return packagesToScan;
+ }
+
+}
\ No newline at end of file
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java
new file mode 100644
index 00000000..54a2964d
--- /dev/null
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java
@@ -0,0 +1,65 @@
+package io.kimmking.rpcfx.api.annotation;
+
+import io.kimmking.rpcfx.api.Filter;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Inherited
+public @interface RpcfxService {
+
+ /**
+ * Interface class name, default value is empty string
+ */
+ String interfaceName() default "";
+
+ /**
+ * Service version, default value is empty string
+ */
+ String version() default "";
+
+ /**
+ * Service group, default value is empty string
+ */
+ String group() default "";
+
+ /**
+ * Service mock name, use interface name + Mock if not set
+ */
+ String mock() default "";
+
+ /**
+ * Timeout value for service invocation, default value is 0
+ */
+
+ int timeout() default 0;
+
+ /**
+ * Filters for service invocation
+ *
+ * @see Filter
+ */
+ String[] filter() default {};
+
+ /**
+ * Service owner name
+ */
+ String owner() default "";
+
+ /**
+ * Application spring bean name
+ */
+ String application() default "";
+
+ /**
+ * Module spring bean name
+ */
+ String module() default "";
+
+ /**
+ * Service tag name
+ */
+ String tag() default "";
+}
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java
new file mode 100644
index 00000000..d262ed06
--- /dev/null
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java
@@ -0,0 +1,4 @@
+package io.kimmking.rpcfx.api.annotation;
+
+public class ServiceAnnotationBeanPostProcessor {
+}
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java
new file mode 100644
index 00000000..54a52449
--- /dev/null
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java
@@ -0,0 +1,277 @@
+package io.kimmking.rpcfx.api.annotation;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.MutablePropertyValues;
+import org.springframework.beans.factory.BeanClassLoaderAware;
+import org.springframework.beans.factory.config.*;
+import org.springframework.beans.factory.support.*;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.context.annotation.AnnotationBeanNameGenerator;
+import org.springframework.context.annotation.AnnotationConfigUtils;
+import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
+import org.springframework.context.annotation.ConfigurationClassPostProcessor;
+import org.springframework.core.annotation.AnnotationAttributes;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.lang.Nullable;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.lang.annotation.Annotation;
+import java.util.*;
+
+import static java.util.Arrays.asList;
+import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
+import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR;
+import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
+import static org.springframework.core.annotation.AnnotationUtils.getAnnotationAttributes;
+import static org.springframework.util.ClassUtils.resolveClassName;
+
+@Slf4j
+public class ServiceClassPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware,
+ ResourceLoaderAware, BeanClassLoaderAware {
+
+ private final static List> serviceAnnotationTypes = asList(
+ RpcfxService.class
+ );
+
+ protected final Set packagesToScan;
+ private Environment environment;
+ private ResourceLoader resourceLoader;
+ private ClassLoader classLoader;
+
+ public ServiceClassPostProcessor(String... packagesToScan) {
+ this(asList(packagesToScan));
+ }
+
+ public ServiceClassPostProcessor(Collection packagesToScan) {
+ this(new LinkedHashSet<>(packagesToScan));
+ }
+
+ public ServiceClassPostProcessor(Set packagesToScan) {
+ this.packagesToScan = packagesToScan;
+ }
+
+ @Override
+ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
+// registerInfrastructureBean(registry, DubboBootstrapApplicationListener.BEAN_NAME, DubboBootstrapApplicationListener.class);
+ Set resolvedPackagesToScan = resolvePackagesToScan(packagesToScan);
+ if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) {
+ registerServiceBeans(resolvedPackagesToScan, registry);
+ } else {
+ if (log.isWarnEnabled()) {
+ log.warn("packagesToScan is empty , ServiceBean registry will be ignored!");
+ }
+ }
+ }
+
+ private void registerServiceBeans(Set packagesToScan, BeanDefinitionRegistry registry) {
+ RpcfxClassPathBeanDefinitionScanner scanner =
+ new RpcfxClassPathBeanDefinitionScanner(registry, environment, resourceLoader);
+ BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry);
+ scanner.setBeanNameGenerator(beanNameGenerator);
+ serviceAnnotationTypes.forEach(annotationType -> {
+ scanner.addIncludeFilter(new AnnotationTypeFilter(annotationType));
+ });
+ for (String packageToScan : packagesToScan) {
+ // Registers @Service Bean first
+ scanner.scan(packageToScan);
+ // Finds all BeanDefinitionHolders of @Service whether @ComponentScan scans or not.
+ Set beanDefinitionHolders =
+ findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator);
+ if (!CollectionUtils.isEmpty(beanDefinitionHolders)) {
+ for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) {
+ registerServiceBean(beanDefinitionHolder, registry, scanner);
+ }
+ if (log.isInfoEnabled()) {
+ log.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " +
+ beanDefinitionHolders +
+ " } were scanned under package[" + packageToScan + "]");
+ }
+ } else {
+ if (log.isWarnEnabled()) {
+ log.warn("No Spring Bean annotating Dubbo's @Service was found under package["
+ + packageToScan + "]");
+ }
+ }
+ }
+ }
+
+ private BeanNameGenerator resolveBeanNameGenerator(BeanDefinitionRegistry registry) {
+ BeanNameGenerator beanNameGenerator = null;
+ if (registry instanceof SingletonBeanRegistry) {
+ SingletonBeanRegistry singletonBeanRegistry = SingletonBeanRegistry.class.cast(registry);
+ beanNameGenerator = (BeanNameGenerator) singletonBeanRegistry.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);
+ }
+ if (beanNameGenerator == null) {
+ if (log.isInfoEnabled()) {
+ log.info("BeanNameGenerator bean can't be found in BeanFactory with name ["
+ + CONFIGURATION_BEAN_NAME_GENERATOR + "]");
+ log.info("BeanNameGenerator will be a instance of " +
+ AnnotationBeanNameGenerator.class.getName() +
+ " , it maybe a potential problem on bean name generation.");
+ }
+ beanNameGenerator = new AnnotationBeanNameGenerator();
+ }
+ return beanNameGenerator;
+ }
+
+ private Set findServiceBeanDefinitionHolders(
+ ClassPathBeanDefinitionScanner scanner, String packageToScan, BeanDefinitionRegistry registry,
+ BeanNameGenerator beanNameGenerator) {
+ Set beanDefinitions = scanner.findCandidateComponents(packageToScan);
+ Set beanDefinitionHolders = new LinkedHashSet<>(beanDefinitions.size());
+ for (BeanDefinition beanDefinition : beanDefinitions) {
+ String beanName = beanNameGenerator.generateBeanName(beanDefinition, registry);
+ BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, beanName);
+ beanDefinitionHolders.add(beanDefinitionHolder);
+ }
+ return beanDefinitionHolders;
+ }
+
+ private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, BeanDefinitionRegistry registry,
+ RpcfxClassPathBeanDefinitionScanner scanner) {
+ Class> beanClass = resolveClass(beanDefinitionHolder);
+ Annotation service = findServiceAnnotation(beanClass);
+ AnnotationAttributes serviceAnnotationAttributes = getAnnotationAttributes(service, false, false);
+ Class> interfaceClass = serviceAnnotationAttributes.getClass("interfaceName"); //resolveServiceInterfaceClass(serviceAnnotationAttributes, beanClass);
+ String annotatedServiceBeanName = beanDefinitionHolder.getBeanName();
+ AbstractBeanDefinition serviceBeanDefinition =
+ buildServiceBeanDefinition(service, serviceAnnotationAttributes, interfaceClass, annotatedServiceBeanName);
+
+ // ServiceBean Bean name
+ String beanName = interfaceClass.getName(); //generateServiceBeanName(serviceAnnotationAttributes, interfaceClass);
+ if (scanner.checkCandidate(beanName, serviceBeanDefinition)) { // check duplicated candidate bean
+ registry.registerBeanDefinition(beanName, serviceBeanDefinition);
+ if (log.isInfoEnabled()) {
+ log.info("The BeanDefinition[" + serviceBeanDefinition +
+ "] of ServiceBean has been registered with name : " + beanName);
+ }
+ } else {
+ if (log.isWarnEnabled()) {
+ log.warn("The Duplicated BeanDefinition[" + serviceBeanDefinition +
+ "] of ServiceBean[ bean name : " + beanName +
+ "] was be found , Did @DubboComponentScan scan to same package in many times?");
+ }
+ }
+ }
+
+ private Annotation findServiceAnnotation(Class> beanClass) {
+ return serviceAnnotationTypes
+ .stream()
+ .map(annotationType -> findMergedAnnotation(beanClass, annotationType))
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElse(null);
+ }
+
+// private String generateServiceBeanName(AnnotationAttributes serviceAnnotationAttributes, Class> interfaceClass) {
+//// ServiceBeanNameBuilder builder = create(interfaceClass, environment)
+//// .group(serviceAnnotationAttributes.getString("group"))
+//// .version(serviceAnnotationAttributes.getString("version"));
+//// return builder.build();
+// return interfaceClass.getName();
+// }
+
+ private Class> resolveClass(BeanDefinitionHolder beanDefinitionHolder) {
+ BeanDefinition beanDefinition = beanDefinitionHolder.getBeanDefinition();
+ return resolveClass(beanDefinition);
+ }
+
+ private Class> resolveClass(BeanDefinition beanDefinition) {
+ String beanClassName = beanDefinition.getBeanClassName();
+ return resolveClassName(beanClassName, classLoader);
+ }
+
+ private Set resolvePackagesToScan(Set packagesToScan) {
+ Set resolvedPackagesToScan = new LinkedHashSet(packagesToScan.size());
+ for (String packageToScan : packagesToScan) {
+ if (StringUtils.hasText(packageToScan)) {
+ String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan.trim());
+ resolvedPackagesToScan.add(resolvedPackageToScan);
+ }
+ }
+ return resolvedPackagesToScan;
+ }
+
+ private AbstractBeanDefinition buildServiceBeanDefinition(Annotation serviceAnnotation,
+ AnnotationAttributes serviceAnnotationAttributes,
+ Class> interfaceClass,
+ String annotatedServiceBeanName) {
+ BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class);
+ AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
+ MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
+ String[] ignoreAttributeNames = of("interfaceName");
+ propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(serviceAnnotation, environment, ignoreAttributeNames));
+ // Set interface
+ builder.addPropertyValue("interface", interfaceClass.getName());
+
+// String moduleConfigBeanName = serviceAnnotationAttributes.getString("module");
+// if (StringUtils.hasText(moduleConfigBeanName)) {
+// addPropertyReference(builder, "module", moduleConfigBeanName);
+// }
+//
+// String[] registryConfigBeanNames = serviceAnnotationAttributes.getStringArray("registry");
+// List registryRuntimeBeanReferences = toRuntimeBeanReferences(registryConfigBeanNames);
+// if (!registryRuntimeBeanReferences.isEmpty()) {
+// builder.addPropertyValue("registries", registryRuntimeBeanReferences);
+// }
+ return builder.getBeanDefinition();
+ }
+
+// private ManagedList toRuntimeBeanReferences(String... beanNames) {
+// ManagedList runtimeBeanReferences = new ManagedList<>();
+// if (!ObjectUtils.isEmpty(beanNames)) {
+// for (String beanName : beanNames) {
+// String resolvedBeanName = environment.resolvePlaceholders(beanName);
+// runtimeBeanReferences.add(new RuntimeBeanReference(resolvedBeanName));
+// }
+// }
+// return runtimeBeanReferences;
+// }
+// private void addPropertyReference(BeanDefinitionBuilder builder, String propertyName, String beanName) {
+// String resolvedBeanName = environment.resolvePlaceholders(beanName);
+// builder.addPropertyReference(propertyName, resolvedBeanName);
+// }
+
+
+ @Override
+ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+
+ }
+
+ @Override
+ public void setEnvironment(Environment environment) {
+ this.environment = environment;
+ }
+
+ @Override
+ public void setResourceLoader(ResourceLoader resourceLoader) {
+ this.resourceLoader = resourceLoader;
+ }
+
+ @Override
+ public void setBeanClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ public static Class> resolveClassName(String className, @Nullable ClassLoader classLoader) throws IllegalArgumentException {
+ try {
+ return Class.forName(className, false, classLoader);
+ } catch (IllegalAccessError var3) {
+ throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" + className + "]: " + var3.getMessage(), var3);
+ } catch (LinkageError var4) {
+ throw new IllegalArgumentException("Unresolvable class definition for class [" + className + "]", var4);
+ } catch (ClassNotFoundException var5) {
+ throw new IllegalArgumentException("Could not find class [" + className + "]", var5);
+ }
+ }
+
+ public static T[] of(T... values) {
+ return values;
+ }
+}
\ No newline at end of file
diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java
index 82575a42..02239cc4 100644
--- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java
+++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java
@@ -37,10 +37,10 @@ public static T createFromRegistry(final Class serviceClass, fin
}
- public static T create(final Class serviceClass, final String url, Filter filter) {
+ public static T create(final Class serviceClass, final String url, Filter... filters) {
// 0. 替换动态代理 -> AOP
- return (T) Proxy.newProxyInstance(Rpcfx.class.getClassLoader(), new Class[]{serviceClass}, new RpcfxInvocationHandler(serviceClass, url, filter));
+ return (T) Proxy.newProxyInstance(Rpcfx.class.getClassLoader(), new Class[]{serviceClass}, new RpcfxInvocationHandler(serviceClass, url, filters));
}
@@ -73,9 +73,11 @@ public Object invoke(Object proxy, Method method, Object[] params) throws Throwa
request.setMethod(method.getName());
request.setParams(params);
- for (Filter filter : filters) {
- if(!filter.filter(request)) {
- return null;
+ if(null != filters) {
+ for (Filter filter : filters) {
+ if (!filter.filter(request)) {
+ throw new RuntimeException(String.format("filter {} return false.", filter.toString()));
+ }
}
}
diff --git a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java
index 3c3ce1d4..8ae7be3c 100644
--- a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java
+++ b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java
@@ -27,13 +27,17 @@ public static void main(String[] args) {
System.out.println("find user id=1 from server: " + user.getName());
OrderService orderService = Rpcfx.create(OrderService.class, "http://localhost:8080/");
- Order order = orderService.findOrderById(1992129);
+ Order order = orderService.findOrderById(1992129);¡
System.out.println(String.format("find order name=%s, amount=%f",order.getName(),order.getAmount()));
//
UserService userService2 = Rpcfx.createFromRegistry(UserService.class, "localhost:2181", new TagRouter(), new RandomLoadBalancer(), new CuicuiFilter());
// SpringApplication.run(RpcfxClientApplication.class, args);
+
+
+
+
}
}
diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java
index e6b58b0e..d0dcc5a5 100644
--- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java
+++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java
@@ -3,6 +3,7 @@
import io.kimmking.rpcfx.api.RpcfxRequest;
import io.kimmking.rpcfx.api.RpcfxResolver;
import io.kimmking.rpcfx.api.RpcfxResponse;
+import io.kimmking.rpcfx.api.ServiceProviderDesc;
import io.kimmking.rpcfx.demo.api.OrderService;
import io.kimmking.rpcfx.demo.api.UserService;
import io.kimmking.rpcfx.server.RpcfxInvoker;
@@ -15,8 +16,6 @@
import org.springframework.web.bind.annotation.RestController;
import java.net.InetAddress;
-import java.net.InterfaceAddress;
-import java.net.UnknownHostException;
@SpringBootApplication
@RestController
@@ -59,15 +58,15 @@ public RpcfxResolver createResolver(){
// annotation
-
- @Bean(name = "io.kimmking.rpcfx.demo.api.UserService")
- public UserService createUserService(){
- return new UserServiceImpl();
- }
-
- @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService")
- public OrderService createOrderService(){
- return new OrderServiceImpl();
- }
+//
+// @Bean(name = "io.kimmking.rpcfx.demo.api.UserService")
+// public UserService createUserService(){
+// return new UserServiceImpl();
+// }
+//
+// @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService")
+// public OrderService createOrderService(){
+// return new OrderServiceImpl();
+// }
}
diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java
index 5c37d60a..12419b35 100644
--- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java
+++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java
@@ -2,7 +2,9 @@
import io.kimmking.rpcfx.demo.api.User;
import io.kimmking.rpcfx.demo.api.UserService;
+import io.kimmking.rpcfx.api.annotation.RpcfxService;
+@RpcfxService(interfaceName = "io.kimmking.rpcfx.demo.api.UserService")
public class UserServiceImpl implements UserService {
@Override