Skip to content

Commit 69065d6

Browse files
committed
data-fast support spring framework advisors
1 parent ee27847 commit 69065d6

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/DataFastConfiguration.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.codingapi.springboot.fast.executor.JpaExecutor;
44
import com.codingapi.springboot.fast.mapping.MvcEndpointMapping;
55
import com.codingapi.springboot.fast.registrar.MvcMappingRegistrar;
6+
import org.springframework.aop.Advisor;
67
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
78
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
89
import org.springframework.context.annotation.Bean;
@@ -11,6 +12,7 @@
1112
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
1213

1314
import javax.persistence.EntityManager;
15+
import java.util.List;
1416

1517
@Configuration
1618
@ConditionalOnClass(WebMvcConfigurer.class)
@@ -25,8 +27,10 @@ public MvcEndpointMapping mvcEndpointMapping(RequestMappingHandlerMapping handle
2527

2628
@Bean(initMethod = "registerMvcMapping")
2729
@ConditionalOnMissingBean
28-
public MvcMappingRegistrar mappingRegistrar(MvcEndpointMapping mvcEndpointMapping, JpaExecutor jpaExecutor) {
29-
return new MvcMappingRegistrar(mvcEndpointMapping, jpaExecutor);
30+
public MvcMappingRegistrar mappingRegistrar(MvcEndpointMapping mvcEndpointMapping,
31+
JpaExecutor jpaExecutor,
32+
List<Advisor> advisors) {
33+
return new MvcMappingRegistrar(mvcEndpointMapping, jpaExecutor,advisors);
3034
}
3135

3236
@Bean

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/executor/MvcMethodProxy.java renamed to springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/executor/MvcMethodInterceptor.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,38 @@
22

33
import com.codingapi.springboot.fast.annotation.FastMapping;
44
import lombok.AllArgsConstructor;
5+
import org.aopalliance.intercept.MethodInterceptor;
6+
import org.aopalliance.intercept.MethodInvocation;
57

6-
import java.lang.reflect.InvocationHandler;
78
import java.lang.reflect.Method;
89

910
@AllArgsConstructor
10-
public class MvcMethodProxy implements InvocationHandler {
11+
public class MvcMethodInterceptor implements MethodInterceptor {
1112

1213
private final JpaExecutor jpaExecutor;
1314

1415
@Override
15-
public Object invoke(Object proxy, Method method, Object[] args)
16+
public Object invoke(MethodInvocation invocation)
1617
throws Throwable {
18+
Method method = invocation.getMethod();
19+
Object[] args = invocation.getArguments();
1720

1821
if (method.equals(Object.class.getMethod("equals", Object.class))) {
1922
return false;
2023
}
24+
2125
if (method.equals(Object.class.getMethod("hashCode"))) {
2226
return hashCode();
2327
}
28+
2429
FastMapping fastMapping = method.getAnnotation(FastMapping.class);
2530
if (fastMapping != null) {
2631
Class<?> returnType = method.getReturnType();
2732
return jpaExecutor.execute(fastMapping.value(), fastMapping.countQuery(), args, returnType);
2833
}
29-
3034
// mvc mapping proxy can't execute return null.
3135
return null;
3236
}
37+
38+
3339
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/registrar/MvcMappingRegistrar.java

+29-9
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import com.codingapi.springboot.fast.annotation.FastMapping;
44
import com.codingapi.springboot.fast.exception.FastMappingErrorException;
55
import com.codingapi.springboot.fast.executor.JpaExecutor;
6-
import com.codingapi.springboot.fast.executor.MvcMethodProxy;
6+
import com.codingapi.springboot.fast.executor.MvcMethodInterceptor;
77
import com.codingapi.springboot.fast.mapping.MvcEndpointMapping;
88
import lombok.AllArgsConstructor;
99
import lombok.SneakyThrows;
1010
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.aop.Advisor;
12+
import org.springframework.aop.framework.AdvisedSupport;
13+
import org.springframework.aop.framework.AopProxy;
14+
import org.springframework.aop.framework.DefaultAopProxyFactory;
1115
import org.springframework.data.domain.Pageable;
1216
import org.springframework.util.StringUtils;
1317

1418
import java.lang.reflect.Method;
15-
import java.lang.reflect.Proxy;
1619
import java.util.HashSet;
20+
import java.util.List;
1721
import java.util.Set;
1822

1923
@Slf4j
@@ -23,43 +27,59 @@ public class MvcMappingRegistrar {
2327
private final MvcEndpointMapping mvcEndpointMapping;
2428
private final JpaExecutor jpaExecutor;
2529

30+
private final DefaultAopProxyFactory proxyFactory = new DefaultAopProxyFactory();
31+
32+
private final List<Advisor> advisors;
33+
2634
@SneakyThrows
2735
public void registerMvcMapping() {
2836
for (Class<?> clazz : classSet) {
2937
Method[] methods = clazz.getDeclaredMethods();
3038
for (Method method : methods) {
3139
FastMapping fastMapping = method.getAnnotation(FastMapping.class);
3240
if (verify(fastMapping, method)) {
33-
MvcMethodProxy handler = new MvcMethodProxy(jpaExecutor);
34-
Object methodProxy = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, handler);
35-
mvcEndpointMapping.addMapping(fastMapping.mapping(), fastMapping.method(), methodProxy, method);
41+
AdvisedSupport advisedSupport = createAdvisedSupport(clazz);
42+
AopProxy proxy = proxyFactory.createAopProxy(advisedSupport);
43+
mvcEndpointMapping.addMapping(fastMapping.mapping(), fastMapping.method(),
44+
proxy.getProxy(), method);
3645
}
3746
}
3847
}
3948
}
4049

50+
private AdvisedSupport createAdvisedSupport(Class<?> clazz){
51+
AdvisedSupport advisedSupport = new AdvisedSupport(clazz);
52+
MvcMethodInterceptor interceptor = new MvcMethodInterceptor(jpaExecutor);
53+
advisedSupport.setTarget(interceptor);
54+
advisedSupport.addAdvisors(advisors);
55+
advisedSupport.addAdvice(interceptor);
56+
return advisedSupport;
57+
}
58+
4159
private boolean verify(FastMapping fastMapping, Method method) throws FastMappingErrorException {
4260
if (fastMapping == null) {
4361
return false;
4462
}
4563

4664
if (!StringUtils.hasText(fastMapping.mapping())) {
47-
throw new FastMappingErrorException(String.format("fast method %s missing mapping .", method.getName()));
65+
throw new FastMappingErrorException(String.format("fast method %s missing mapping .",
66+
method.getName()));
4867
}
4968

5069
if (!StringUtils.hasText(fastMapping.value())) {
51-
throw new FastMappingErrorException(String.format("fast mapping %s missing value .", fastMapping.mapping()));
70+
throw new FastMappingErrorException(String.format("fast mapping %s missing value .",
71+
fastMapping.mapping()));
5272
}
5373

5474
Class<?>[] parameterTypes = method.getParameterTypes();
5575
for (Class<?> parameter : parameterTypes) {
5676
if (Pageable.class.isAssignableFrom(parameter)) {
5777
if (!StringUtils.hasText(fastMapping.countQuery())) {
58-
throw new FastMappingErrorException(String.format("fast mapping %s missing countQuery .", fastMapping.mapping()));
78+
throw new FastMappingErrorException(String.format("fast mapping %s missing countQuery .",
79+
fastMapping.mapping()));
5980
}
6081
}
6182
}
62-
6383
return true;
6484
}
6585

0 commit comments

Comments
 (0)