Skip to content

Commit

Permalink
常用的Advice
Browse files Browse the repository at this point in the history
  • Loading branch information
DerekYRC committed Dec 6, 2020
1 parent 7d7f531 commit c55ba9c
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
* [基于JDK的动态代理](#基于JDK的动态代理)
* [基于CGLIB的动态代理](#基于CGLIB的动态代理)
* [AOP代理工厂ProxyFactory](#AOP代理工厂ProxyFactory)
* [几种常用的Advice:BeforeAdvice/AfterAdvice/AfterReturningAdvice/ThrowsAdvice](#几种常用的Advice)
* [动态代理融入bean生命周期](#动态代理融入bean生命周期)


Expand Down
76 changes: 76 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -789,4 +789,80 @@ public class DynamicProxyTest {
}
}
```

## 几种常用的Advice:BeforeAdvice/AfterAdvice/AfterReturningAdvice/ThrowsAdvice...
> 分支: common-advice
Spring将AOP联盟中的Advice细化出各种类型的Advice,常用的有BeforeAdvice/AfterAdvice/AfterReturningAdvice/ThrowsAdvice,我们可以通过扩展MethodInterceptor来实现。

只简单实现BeforeAdvice,有兴趣的同学可以帮忙实现另外几种Advice。定义MethodBeforeAdviceInterceptor拦截器,在执行被代理方法之前,先执行BeforeAdvice的方法。
- [x] BeforeAdvice
- [ ] AfterAdvice
- [ ] AfterReturningAdvice
- [ ] ThrowsAdvice

测试:
```
public class WorldServiceBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("BeforeAdvice: do something before the earth explodes");
}
}
```
```
public class DynamicProxyTest {
private AdvisedSupport advisedSupport;
@Before
public void setup() {
WorldService worldService = new WorldServiceImpl();
advisedSupport = new AdvisedSupport();
TargetSource targetSource = new TargetSource(worldService);
MethodMatcher methodMatcher = new AspectJExpressionPointcut("execution(* org.springframework.test.service.WorldService.explode(..))").getMethodMatcher();
advisedSupport.setTargetSource(targetSource);
advisedSupport.setMethodMatcher(methodMatcher);
}
@Test
public void testBeforeAdvice() throws Exception {
//设置BeforeAdvice
WorldServiceBeforeAdvice beforeAdvice = new WorldServiceBeforeAdvice();
MethodBeforeAdviceInterceptor methodInterceptor = new MethodBeforeAdviceInterceptor(beforeAdvice);
advisedSupport.setMethodInterceptor(methodInterceptor);
WorldService proxy = (WorldService) new ProxyFactory(advisedSupport).getProxy();
proxy.explode();
}
}
```



























11 changes: 11 additions & 0 deletions src/main/java/org/springframework/aop/BeforeAdvice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.springframework.aop;

import org.aopalliance.aop.Advice;

/**
* @author derekyi
* @date 2020/12/6
*/
public interface BeforeAdvice extends Advice {

}
12 changes: 12 additions & 0 deletions src/main/java/org/springframework/aop/MethodBeforeAdvice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.springframework.aop;

import java.lang.reflect.Method;

/**
* @author derekyi
* @date 2020/12/6
*/
public interface MethodBeforeAdvice extends BeforeAdvice {

void before(Method method, Object[] args, Object target) throws Throwable;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.springframework.aop.framework.adapter;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.MethodBeforeAdvice;

/**
* @author derekyi
* @date 2020/12/6
*/
public class MethodBeforeAdviceInterceptor implements MethodInterceptor {

private MethodBeforeAdvice advice;

public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
this.advice = advice;
}

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//在执行被代理方法之前,先执行before advice操作
this.advice.before(invocation.getMethod(), invocation.getArguments(), invocation.getThis());
return invocation.proceed();
}
}
29 changes: 29 additions & 0 deletions src/test/java/org/springframework/test/aop/DynamicProxyTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import org.springframework.aop.framework.CglibAopProxy;
import org.springframework.aop.framework.JdkDynamicAopProxy;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor;
import org.springframework.test.common.WorldServiceBeforeAdvice;
import org.springframework.test.common.WorldServiceInterceptor;
import org.springframework.test.service.WorldService;
import org.springframework.test.service.WorldServiceImpl;
Expand Down Expand Up @@ -58,4 +60,31 @@ public void testProxyFactory() throws Exception {
proxy = (WorldService) new ProxyFactory(advisedSupport).getProxy();
proxy.explode();
}

@Test
public void testBeforeAdvice() throws Exception {
//设置BeforeAdvice
WorldServiceBeforeAdvice beforeAdvice = new WorldServiceBeforeAdvice();
MethodBeforeAdviceInterceptor methodInterceptor = new MethodBeforeAdviceInterceptor(beforeAdvice);
advisedSupport.setMethodInterceptor(methodInterceptor);

WorldService proxy = (WorldService) new ProxyFactory(advisedSupport).getProxy();
proxy.explode();
}
}
















Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.springframework.test.common;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
* @author derekyi
* @date 2020/12/6
*/
public class WorldServiceBeforeAdvice implements MethodBeforeAdvice {

@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("BeforeAdvice: do something before the earth explodes");
}
}

0 comments on commit c55ba9c

Please sign in to comment.