Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
@Component
public class InvocationDispatcherImpl extends AbstractInvocationDispatcher<ProxyStub, Void> {
@Override
protected Object invoke(StubContext<ProxyStub> stubContext, Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(stubContext.getAnnotation());
protected Object invoke(StubContext<ProxyStub> stubProxyContext, Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(stubProxyContext.getAnnotation());
System.out.println("InvocationDispatcherImpl");
return null;
}
Expand Down Expand Up @@ -75,8 +75,8 @@ public class HelloServiceTest {
@Component
public class InvocationDispatcherImpl extends AbstractInvocationDispatcher<TestClient, Void> {
@Override
protected Object invoke(StubContext<TestClient> stubContext, Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(stubContext.getAnnotation());
protected Object invoke(StubContext<TestClient> stubProxyContext, Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(stubProxyContext.getAnnotation());
System.out.println("InvocationDispatcherImpl");
return null;
}
Expand Down
20 changes: 12 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

<groupId>com.github.yungyu16.spring</groupId>
<artifactId>spring-boot-starter-proxy</artifactId>
<version>1.0.0</version>
<name>${project.groupId}:${project.artifactId}</name>
<version>1.1.0</version>
<name>${project.artifactId}</name>
<description>将不可实例化的Interface动态代理后注册到Spring容器以便IOC,用于便捷的生成Local Stub</description>
<url>https://github.com/yungyu16/version-maven-plugin.git</url>
<licenses>
Expand Down Expand Up @@ -56,18 +56,12 @@
<system>Github Issues</system>
<url>https://github.com/yungyu16/spring-boot-starter-proxy/issues</url>
</issueManagement>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
Expand All @@ -78,6 +72,11 @@
<artifactId>spring-boot-starter-logging</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<distributionManagement>
<snapshotRepository>
Expand All @@ -91,6 +90,11 @@
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>com.github.yungyu16.maven</groupId>
<artifactId>version-maven-plugin</artifactId>
<version>1.0.1</version>
</plugin>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down

This file was deleted.

30 changes: 0 additions & 30 deletions src/main/java/com/github/yungyu16/spring/proxy/StubContext.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.yungyu16.spring.proxy;
package com.github.yungyu16.spring.stub;

import com.github.yungyu16.spring.stub.proxy.DefaultStubProxyFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand All @@ -18,4 +19,9 @@ public StubDefPostProcessor stubBeanFactoryPostProcessor() {
public StubBeanPostProcessor stubBeanPostProcessor() {
return new StubBeanPostProcessor();
}

@Bean
public DefaultStubProxyFactory defaultStubProxyFactory() {
return new DefaultStubProxyFactory();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.yungyu16.spring.proxy;
package com.github.yungyu16.spring.stub;

import com.github.yungyu16.spring.proxy.annotation.ProxyStubScan;
import com.github.yungyu16.spring.proxy.support.ClassPathStubBeanDefinitionScanner;
import com.github.yungyu16.spring.stub.annotation.ProxyStubScan;
import com.github.yungyu16.spring.stub.support.ClassPathStubBeanDefinitionScanner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.EnvironmentAware;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.github.yungyu16.spring.stub;

import com.github.yungyu16.spring.stub.annotation.ProxyStub;
import com.github.yungyu16.spring.stub.proxy.StubProxyFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanCreationNotAllowedException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.core.annotation.AnnotatedElementUtils;

/**
* CreatedDate: 2020/11/24
* Author: songjialin
*/
public class StubBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanFactoryAware {
private BeanFactory beanFactory;

@Override
@SuppressWarnings("all")
public Object postProcessBeforeInstantiation(Class<?> type, String name) throws BeansException {
ProxyStub proxyStub = AnnotatedElementUtils.getMergedAnnotation(type, ProxyStub.class);
if (proxyStub == null) {
return null;
}
if (!type.isInterface()) {
throw new BeanCreationNotAllowedException(name, type.getName() + " 不是Interface");
}
StubProxyFactory stubProxyFactory = getStubProxyFactory(proxyStub);
return stubProxyFactory.createProxy(type, proxyStub);
}

private StubProxyFactory getStubProxyFactory(ProxyStub proxyStub) {
Class<? extends StubProxyFactory> factoryType = proxyStub.factoryType();
return beanFactory.getBean(factoryType);
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.yungyu16.spring.proxy;
package com.github.yungyu16.spring.stub;

import com.github.yungyu16.spring.proxy.support.BeanDefinitionRegistryPostProcessorAdapter;
import com.github.yungyu16.spring.proxy.support.ClassPathStubBeanDefinitionScanner;
import com.github.yungyu16.spring.stub.support.BeanDefinitionRegistryPostProcessorAdapter;
import com.github.yungyu16.spring.stub.support.ClassPathStubBeanDefinitionScanner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.github.yungyu16.spring.proxy.annotation;
package com.github.yungyu16.spring.stub.annotation;

import com.github.yungyu16.spring.proxy.AbstractInvocationDispatcher;
import com.github.yungyu16.spring.stub.proxy.AbstractInvocationDispatcher;
import com.github.yungyu16.spring.stub.proxy.DefaultStubProxyFactory;
import com.github.yungyu16.spring.stub.proxy.StubProxyFactory;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

Expand All @@ -24,15 +26,23 @@
String beanName() default "";

/**
* 指定动态代理调用拦截器BeanType,用于从BeanFactory中按类型获取bean
* 指定动态代理工厂,用于定制动态代理方案比如Cglib、ByteBuddy等
* 默认使用基于JdkDynamicProxy代理并使用AbstractInvocationDispatcher拦截方法调用
*
* @return
*/
Class<? extends StubProxyFactory> factoryType() default DefaultStubProxyFactory.class;

/**
* 指定JdkDynamicProxy调用拦截器BeanType,用于从BeanFactory中按类型获取bean
*
* @return
*/
@AliasFor("dispatcherType")
Class<? extends AbstractInvocationDispatcher> value() default AbstractInvocationDispatcher.class;

/**
* 指定动态代理调用拦截器BeanType,用于从BeanFactory中按类型获取bean
* 指定JdkDynamicProxy调用拦截器BeanType,用于从BeanFactory中按类型获取bean
*
* @return
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.yungyu16.spring.proxy.annotation;
package com.github.yungyu16.spring.stub.annotation;

import com.github.yungyu16.spring.proxy.StubBeanDefinitionRegistrar;
import com.github.yungyu16.spring.stub.StubBeanDefinitionRegistrar;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.AliasFor;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.github.yungyu16.spring.proxy;
package com.github.yungyu16.spring.stub.proxy;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;
import lombok.ToString;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
Expand Down Expand Up @@ -51,12 +54,29 @@ Class<ANNOTATION_TYPE> getAnnotationType() {
return (Class<ANNOTATION_TYPE>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

protected Object invoke(StubContext<ANNOTATION_TYPE> stubContext, Object proxy, Method method, Object[] args) throws Throwable {
protected Object invoke(StubProxyContext<ANNOTATION_TYPE> stubProxyContext, Object proxy, Method method, Object[] args) throws Throwable {
return invoke(proxy, method, args);
}

protected Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
throw new UnsupportedOperationException();
}

@Getter
@EqualsAndHashCode
@ToString
protected static class StubProxyContext<T extends Annotation> {
private final T annotation;
private final Class<?> stubType;

private StubProxyContext(@NonNull Class<?> stubType, T annotation) {
this.annotation = annotation;
this.stubType = stubType;
}

public static <T extends Annotation> StubProxyContext<T> valueOf(Class<?> stubType, T annotation) {
return new StubProxyContext<>(stubType, annotation);
}
}
}

Loading