提交 2f8decaf 编写于 作者: L lvxuhong

客户端整合spring

上级 f910b033
package github.javaguide;
import github.javaguide.proxy.RpcClientProxy;
import github.javaguide.remoting.transport.ClientTransport;
import github.javaguide.remoting.transport.netty.client.NettyClientTransport;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class ClientProxy {
public static <T> T getServiceProxy(Class<T> serviceClass) {
ClientTransport rpcClient = new NettyClientTransport();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcClient);
return rpcClientProxy.getProxy(serviceClass);
}
}
package github.javaguide;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class ClientTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(Config.class);
applicationContext.refresh();
applicationContext.start();
}
}
package github.javaguide;
import github.javaguide.spring.annotation.RpcServiceScan;
import org.springframework.context.annotation.Configuration;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
@Configuration
@RpcServiceScan("github.javaguide.spring.service")
//@Import(RpcServiceScannerRegistrar.class)
public class Config {
}
package github.javaguide.spring.annotation;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RpcServiceScannerRegistrar.class)
public @interface RpcServiceScan {
String value();
}
package github.javaguide.spring.annotation;
import github.javaguide.spring.rpcservice.Scanner;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class RpcServiceScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AnnotationAttributes annoAttrs = AnnotationAttributes.fromMap(
importingClassMetadata.getAnnotationAttributes(RpcServiceScan.class.getName()));
Scanner scanner = new Scanner(registry);
String value = annoAttrs.getString("value");
if (resourceLoader != null) {
scanner.setResourceLoader(resourceLoader);
}
//所有的接口全部注入
scanner.addIncludeFilter(new TypeFilter() {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
return true;
}
});
scanner.doScan(value);
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
}
package github.javaguide.spring.rpcservice;
import github.javaguide.ClientProxy;
import org.springframework.beans.factory.FactoryBean;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class RpcServiceFactoryBean<T> implements FactoryBean<T> {
private Class<T> rpcServiceInterface;
public RpcServiceFactoryBean() {
}
public RpcServiceFactoryBean(Class<T> rpcServiceInterface) {
this.rpcServiceInterface = rpcServiceInterface;
}
@Override
public T getObject() throws Exception {
if (rpcServiceInterface == null) {
throw new IllegalStateException("");
}
return ClientProxy.getServiceProxy(rpcServiceInterface);
// return (T) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{rpcServiceInterface}, new InvocationHandler() {
// @Override
// public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
// if(method.equals()){}
// return null;
// }
// });
}
@Override
public Class<?> getObjectType() {
return rpcServiceInterface;
}
@Override
public boolean isSingleton() {
return false;
}
}
package github.javaguide.spring.rpcservice;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import java.util.Arrays;
import java.util.Set;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class Scanner extends ClassPathBeanDefinitionScanner {
private RpcServiceFactoryBean<Object> rpcServiceFactoryBean = new RpcServiceFactoryBean<>();
public Scanner(BeanDefinitionRegistry registry) {
super(registry);
}
@Override
public Set<BeanDefinitionHolder> doScan(String... basePackages) {
//父类在扫描的时候 beanDefinition 会通过 registry 注册,我们需要修改 beanDefinition 的 beanClass
Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);
processBeanDefinitions(beanDefinitions);
return beanDefinitions;
}
/**
* 主要是将beanDefinition 的beanClass 设置成我们自定义的FactoryBean
*
* @param beanDefinitions
*/
private void processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {
GenericBeanDefinition definition;
for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitions) {
definition = (GenericBeanDefinition) beanDefinitionHolder.getBeanDefinition();
definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName());
definition.setBeanClass(rpcServiceFactoryBean.getClass());
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
}
}
/**
* {@inheritDoc}
*/
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return beanDefinition.getMetadata().isInterface() && beanDefinition.getMetadata().isIndependent();
}
}
package github.javaguide.spring.service;
public interface Service1 {
}
package github.javaguide.spring.service;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public interface Service2 {
}
import github.javaguide.Config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
/**
* @description:
* @author:lvxuhong
* @date:2020/6/18
*/
public class ClientTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(Config.class);
applicationContext.refresh();
applicationContext.start();
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String s : beanDefinitionNames) {
System.out.println(s);
}
applicationContext.getBean("Service1");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册