spring aop概念以及jdk的动态代理

  AOP(Aspect-Oriented Programming),又称为面向切面编程。作为一种编程思想,AOP是 OOP(Object-Oriented Programing面向对象编程)一种 补充和完善。

  AOP相关的术语

  1.0 关注点

  关注点就是所关注的与业务无关的公共服务或系统级服务,如日志记录,权限检查,事务管理等。关注点通常称为横切关注点,表示要做什么。

  2.0 连接点

  连接点就是程序执行过程中明确的阶段点,如方法的调用或异常的抛出等。其实,关注点的功能就是添加到相应的连接点。因此,连接点表示在那里做。在spring aop中,一个连接点总代表一个方法的执行。

  3.0增强

  增强就是在特定的连接点处所执行的处理逻辑,也就是面向连接点注入代码。增强通常有称为增强处理,表示具体做什么。

  3.1.0 Before Advice 前置处理,在连接点执行前处理。

  3.2.0 AfterReturning Advice后置增强,在连接点成功执行后调用。

  3.3.0 AfterThrowing Advice,异常增强,在连接点抛出异常后被调用。

  3.4.0 Around Advice 环境增强,在连接点执行前与执行后被调用。

  4.0 切入点

  切入点就是可以插入增强的连接点。

  

spring aop概念以及jdk的动态代理

 

  Jdk的动态代理

  AOP是基于代理实现的,代理分为2大类,静态代理与动态代理。静态代理是在编译时候生成的,动态代理是在运行的时候生成的。

  下面看一个jdk的动态代理的deom。

  jdk动态代理需要一个接口,以及其实现类。

  定义接口 UserService

  package dflx;

  public interface UserService {

  public void add();

  public void serach();

  }

  以及其实现类UserImpl,和jdk动态代理类MyJdkProxy

  public class UserImpl implements UserService {

  @Override

  public void add() {

  System.out.println( add user);

  }

  @Override

  public void serach() {

  System.out.println(search user);

  }

  }

  class MyJdkProxy implements InvocationHandler{

  private UserService user;

  public MyJdkProxy(UserService user)

  {

  this.user=user;

  }

  public UserService createJDKProxy(){

  return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(),

  user.getClass().getInterfaces(),this);

  }

  @Override

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  if(method.getName().equals(add))

  {

  System.out.println(记录日志);

  return method.invoke(user, args);

  }else {

  return method.invoke(user, args);

  }

  }

  }

  测试类 MyJdkTest 如下

  package dflx;

  import org.junit.Test;

  public class MyJdkTest {

  @Test

  public void test() {

  //代理对象

  UserService user=new UserImpl();

  //创建代理

  MyJdkProxy myJdkProxy=new MyJdkProxy(user);

  UserService proxy=myJdkProxy.createJDKProxy();

  proxy.add(); //对add方法进行了增强

  proxy.serach();

  }

  }

  对add方法,进行了增强。

  结果如下

  记录日志

  add user

  search user

  

;