Spring AOP的几个概念
1.切面(Aspect):切面就是一个关注点的模块化,如事务管理、日志管理、权限管理等;
2.连接点(Joinpoint):程序执行时的某个特定的点,在Spring中就是一个方法的执行;
3.通知(Advice):通知就是在切面的某个连接点上执行的操作,也就是事务管理、日志管理等;
4.切入点(Pointcut):切入点就是描述某一类选定的连接点,也就是指定某一类要织入通知的方法;
5.目标对象(Target):就是被AOP动态代理的目标对象;
借助下图进行理解:
![](https://i-blog.csdnimg.cn/blog_migrate/e94bc8885d08c6e4341c4bd019afea23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a59048d93f14dccaba7b1e8e30621016.jpeg)
先来了解切面编程的使用
前置增强
创建一个前置增强类
package cjq.demo.spring.aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* author: cjianquan
* date: 2016/9/9
*/
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("GreetingBeforeAdvice Before");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
后置增强
package cjq.demo.spring.aop;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
/**
* author: cjianquan
* date: 2016/9/9
*/
public class GreetingAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object result, Method method, Object[] args, Object target) throws Throwable {
System.out.println("GreetingAfterAdvice After");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
测试代码:
@Test
public void test_springAop(){
ProxyFactory proxyFactory = new ProxyFactory(); // 创建代理工厂
proxyFactory.setTarget(new GreetingImpl()); // 射入目标类对象
proxyFactory.addAdvice(new GreetingBeforeAdvice()); // 添加前置增强
proxyFactory.addAdvice(new GreetingAfterAdvice()); // 添加后置增强
Greeting greeting = (Greeting) proxyFactory.getProxy(); // 从代理工厂中获取代理
greeting.sayHello("Jack");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
当然,我们完全可以只定义一个增强类,让它同时实现 MethodBeforeAdvice 与 AfterReturningAdvice 这两个接口,如下
package cjq.demo.spring.aop;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* author: cjianquan
* date: 2016/9/9
*/
public class GreetingBeforeAndAfterAdvice implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(" GreetingBeforeAndAfterAdvice Before");
}
@Override
public void afterReturning(Object result, Method method, Object[] args, Object target) throws Throwable {
System.out.println("GreetingBeforeAndAfterAdvice After");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
测试代码:
@Test
public void test_springAop1(){
ProxyFactory proxyFactory = new ProxyFactory(); // 创建代理工厂
proxyFactory.setTarget(new GreetingImpl()); // 射入目标类对象
proxyFactory.addAdvice(new GreetingBeforeAndAfterAdvice()); // 添加增强
Greeting greeting = (Greeting) proxyFactory.getProxy(); // 从代理工厂中获取代理
greeting.sayHello("Jack");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
环绕增强
package cjq.demo.spring.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.stereotype.Component;
/**
* author: cjianquan
* date: 2016/9/9
*/
@Component("greetingAroundAdvice")
public class GreetingAroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
before();
Object result = invocation.proceed();
after();
return result;
}
private void before() {
System.out.println("GreetingAroundAdvice Before");
}
private void after() {
System.out.println("GreetingAroundAdvice After");
}
}
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean id="greetingBefore" class="com.jike.spring.chapter10.aop.advice.WaiterBeforeAdvice" />
- <bean id="greetingAfter" class="com.jike.spring.chapter10.aop.advice.WaiterAfterAdvice" />
- <bean id="greetingAround" class="com.jike.spring.chapter10.aop.advice.WaiterAroundAdvice" />
- <bean id="target" class="com.jike.spring.chapter10.aop.advice.NativeWaiter" />
- <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:proxyInterfaces="com.jike.spring.chapter10.aop.advice.Waiter"
- p:target-ref="target" p:interceptorNames="greetingAround" />
- </beans>
测试代码:
@Test
public void test_greetingAroundAdvice(){
ProxyFactory proxyFactory = new ProxyFactory(); // 创建代理工厂
proxyFactory.setTarget(new GreetingImpl()); // 射入目标类对象
proxyFactory.addAdvice(new GreetingAroundAdvice()); // 添加增强
Greeting greeting = (Greeting) proxyFactory.getProxy(); // 从代理工厂中获取代理
greeting.sayHello("Jack");
}
- 1
参考文章:
http://my.oschina.net/huangyong/blog/161338#navbar-header