Skip to content

Commit 08c44ee

Browse files
committed
✨ add methodRefund advice, 增强advisor的before和returning逻辑
1 parent b7849c0 commit 08c44ee

File tree

12 files changed

+183
-27
lines changed

12 files changed

+183
-27
lines changed

src/main/java/com/dianpoint/summer/aop/AopProxyFactory.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ public interface AopProxyFactory {
99

1010
/**
1111
* 创建AopProxy
12-
*
13-
* @param target
14-
* 被代理类
15-
* @return aopProxy代理接口,提供不同代理方式
12+
*
13+
* @param target 被代理类
14+
* @return aopProxy代理接口, 提供不同代理方式
1615
*/
17-
AopProxy createAopProxy(Object target);
16+
AopProxy createAopProxy(Object target, Advisor advisor);
1817

1918
}

src/main/java/com/dianpoint/summer/aop/DefaultAopProxyFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
/**
44
* 默认的AOP Proxy代理类创建工厂,此处采用JDK动态代理来生成代理类
5-
*
5+
*
66
* @author: github/ccoderJava
77
* @email: congccoder@gmail.com
88
* @date: 2023/3/26 20:58
99
*/
1010
public class DefaultAopProxyFactory implements AopProxyFactory {
1111
@Override
12-
public AopProxy createAopProxy(Object target) {
12+
public AopProxy createAopProxy(Object target, Advisor advisor) {
1313

1414
// 采用JDK dynamicProxy来实现代理类的创建
15-
return new JdkDynamicAopProxy(target);
15+
return new JdkDynamicAopProxy(target, advisor);
1616
}
1717
}

src/main/java/com/dianpoint/summer/aop/JdkDynamicAopProxy.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66

77
/**
88
* JDK Dynamic Proxy 实现AOP
9-
*
9+
*
1010
* @author: github/ccoderJava
1111
* @email: congccoder@gmail.com
1212
* @date: 2023/3/26 21:04
1313
*/
1414
public class JdkDynamicAopProxy implements AopProxy, InvocationHandler {
1515

1616
Object target;
17+
Advisor advisor;
1718

18-
public JdkDynamicAopProxy(Object target) {
19+
public JdkDynamicAopProxy(Object target, Advisor advisor) {
1920
this.target = target;
21+
this.advisor = advisor;
2022
}
2123

2224
@Override
@@ -26,9 +28,12 @@ public Object getProxy() {
2628

2729
@Override
2830
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
29-
System.out.println("代理类执行之前");
30-
Object invokeResult = method.invoke(target, args);
31-
System.out.println("代理类执行之后");
32-
return invokeResult;
31+
if (method.getName().equals("doAction")) {
32+
Class<?> targetClass = target != null ? target.getClass() : null;
33+
MethodInterceptor interceptor = this.advisor.getMethodInterceptor();
34+
ReflectiveMethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass);
35+
return interceptor.invoke(invocation);
36+
}
37+
return null;
3338
}
3439
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.dianpoint.summer.aop;
2+
3+
import java.lang.reflect.Method;
4+
5+
public interface MethodReturningAdvice extends AfterAdvice{
6+
7+
void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable;
8+
}

src/main/java/com/dianpoint/summer/aop/ProxyFactoryBean.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.dianpoint.summer.aop;
22

3+
import com.dianpoint.summer.beans.BeansException;
4+
import com.dianpoint.summer.beans.factory.BeanFactory;
35
import com.dianpoint.summer.beans.factory.FactoryBean;
6+
import com.dianpoint.summer.util.ClassUtils;
7+
import com.fasterxml.jackson.databind.util.ClassUtil;
48

59
/**
610
* @author: github/ccoderJava
@@ -9,11 +13,15 @@
913
*/
1014
public class ProxyFactoryBean implements FactoryBean<Object> {
1115

16+
private BeanFactory beanFactory;
1217
private AopProxyFactory aopProxyFactory;
13-
18+
private String interceptorName;
19+
private String targetName;
1420
private Object target;
15-
21+
private ClassLoader proxyClassLoader = ClassUtils.getDefaultClassLoader();
1622
private Object singletonInstance;
23+
private Advisor advisor;
24+
1725

1826
public ProxyFactoryBean() {
1927
// 默认才用Jdk Dynamic 代理来实现AOP 可在此进行扩展
@@ -25,20 +33,31 @@ public Object getObject() throws Exception {
2533
return null;
2634
}
2735

36+
private synchronized void initializeAdvisor() {
37+
Object advice = null;
38+
MethodInvocation methodInvocation = null;
39+
try {
40+
advice = this.beanFactory.getBean(this.interceptorName);
41+
} catch (BeansException e) {
42+
e.printStackTrace();
43+
}
44+
advisor = new DefaultAdvisor();
45+
advisor.setMethodInterceptor((MethodInterceptor) advice);
46+
}
47+
2848
@Override
2949
public Class<?> getObjectType() {
3050
return null;
3151
}
3252

3353
public AopProxy createAopProxy() {
34-
return getAopProxyFactory().createAopProxy(target);
54+
return getAopProxyFactory().createAopProxy(target, this.advisor);
3555
}
3656

3757
/**
3858
* 通过AopProxy接口获取代理类,实现方式为AopProxy接口实现的DefaultAopProxyFactory或者其余可扩展的代理工厂类
39-
*
40-
* @param aopProxy
41-
* aopProxy
59+
*
60+
* @param aopProxy aopProxy
4261
* @return 代理结果
4362
*/
4463
public Object getProxy(AopProxy aopProxy) {
@@ -47,7 +66,7 @@ public Object getProxy(AopProxy aopProxy) {
4766

4867
/**
4968
* 获取代理对象的单例bean
50-
*
69+
*
5170
* @return 单例Bean
5271
*/
5372
public synchronized Object getSingletonInstance() {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.dianpoint.summer.aop;
2+
3+
import java.lang.reflect.Method;
4+
5+
public class ReflectiveMethodInvocation implements MethodInvocation {
6+
7+
private final Object proxy;
8+
private final Object target;
9+
private final Object[] arguments;
10+
private final Method method;
11+
private Class<?> targetClass;
12+
13+
public ReflectiveMethodInvocation(Object proxy, Object target, Method method, Object[] arguments, Class<?> targetClass) {
14+
this.proxy = proxy;
15+
this.target = target;
16+
this.arguments = arguments;
17+
this.targetClass = targetClass;
18+
this.method = method;
19+
}
20+
21+
22+
@Override
23+
public Method getMethod() {
24+
return this.method;
25+
}
26+
27+
@Override
28+
public Object[] getArguments() {
29+
return this.arguments;
30+
}
31+
32+
@Override
33+
public Object getThis() {
34+
return this.target;
35+
}
36+
37+
public Object getProxy() {
38+
return proxy;
39+
}
40+
41+
public Object getTarget() {
42+
return target;
43+
}
44+
45+
public Class<?> getTargetClass() {
46+
return targetClass;
47+
}
48+
49+
public void setTargetClass(Class<?> targetClass) {
50+
this.targetClass = targetClass;
51+
}
52+
53+
@Override
54+
public Object proceed() throws Throwable {
55+
return this.method.invoke(this.target, this.arguments);
56+
}
57+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.dianpoint.summer.util;
2+
3+
public abstract class ClassUtils {
4+
5+
6+
public static ClassLoader getDefaultClassLoader() {
7+
ClassLoader cl = null;
8+
try {
9+
cl = Thread.currentThread().getContextClassLoader();
10+
} catch (Throwable ignored) {
11+
12+
}
13+
if (cl == null) {
14+
cl = ClassUtils.class.getClassLoader();
15+
if (cl == null) {
16+
try {
17+
cl = ClassLoader.getSystemClassLoader();
18+
} catch (Throwable ignored) {
19+
20+
}
21+
}
22+
}
23+
return cl;
24+
}
25+
}

src/test/java/com/dianpoint/summer/test/SimpleIOCTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.dianpoint.summer.beans.BeansException;
44
import com.dianpoint.summer.context.ClassPathXmlApplicationContext;
5+
import com.dianpoint.summer.test.service.ActionOne;
6+
import com.dianpoint.summer.test.service.IAction;
57
import com.dianpoint.summer.test.service.OtherTwoService;
68
import com.dianpoint.summer.test.service.SimpleService;
79

@@ -14,14 +16,11 @@ public class SimpleIOCTest {
1416

1517
public static void main(String[] args) throws BeansException {
1618
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
17-
SimpleService simpleService = (SimpleService)applicationContext.getBean("simpleService");
18-
simpleService.sayHello();
1919

20-
System.out.println("==================");
2120

22-
OtherTwoService otherTwoService = (OtherTwoService)applicationContext.getBean("otherTwoService");
23-
otherTwoService.sayHello();
24-
otherTwoService.sayBye();
21+
IAction action = (IAction) applicationContext.getBean("actionOne");
22+
action.doAction();
23+
action.doSomething();
2524

2625
}
2726
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.dianpoint.summer.test.service;
2+
3+
public class ActionOne implements IAction {
4+
@Override
5+
public void doAction() {
6+
System.out.println("执行真是的doAction");
7+
}
8+
9+
@Override
10+
public void doSomething() {
11+
System.out.println("执行真实的doSomething");
12+
}
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.dianpoint.summer.test.service;
2+
3+
public interface IAction {
4+
void doAction();
5+
6+
void doSomething();
7+
}

0 commit comments

Comments
 (0)