Java动态代理模拟spring的AOP

      广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者咨询。

  spring中的AOP是通过Java的动态代理实现的,有关动态代理的详细解释参见:

  现在就使用Java的动态代理模拟AOP(使用JDK的动态代理)

  1.建立实体对象

  public class User {

  Integer id;

  String name;

  String pwd;

  public User() {

  }

  public User(int id, String name, String pwd) {

  this.id = id;

  this.name = name;

  this.pwd = pwd;

  }

  //setter/getter

  }

  2.建立接口

  public interface UserDao {

  public void addUser(User user);

  }

  3.实现接口

  public class UserDaoImpl implements UserDao{

  @Override

  public void addUser(User user){

  System.out.println("保存User到数据库中");

  throw new RuntimeException();

  }

  }

  4.创建拦截器(这个类就相当于aop中的切面类)

  public class MyInterceptor implements InvocationHandler {

  private Object target;

  public MyInterceptor() {

  }

  public MyInterceptor(Object target) {

  this.target = target;

  }

  public Object getTarget() {

  return target;

  }

  public void setTarget(Object target) {

  this.target = target;

  }

  public void before() {

  System.out.println("这是一个前置通知");

  }

  public void afterReturning() {

  System.out.println("这是一个后置通知");

  }

  public void afterThrowing() {

  System.out.println("这是一个异常通知");

  }

  public void after() {

  System.out.println("这是一个最终通知");

  }

  @Override

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

  Object returnValue = null;

  try {

  before();

  returnValue = method.invoke(target, args);

  afterReturning();

  } catch (Exception e) {

  afterThrowing();

  } finally {

  after();

  }

  return returnValue;

  }

  }

  5.通过代理对象实现目标方法

  @Test

  public void testAOP() {

  UserDao userDao = new UserDao();

  MyInterceptor interceptor = new MyInterceptor();

  interceptor.setTarget(userDao);

  //通过代理的静态方法创建一个代理对象

  //这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个

  方法。

  //因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型

  UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(),

  userDao.getClass().getInterfaces(),

  interceptor);

  //然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上

  userDaoProxy.addUser(new User(1, "a", "b"));

  }

  6.程序输出

  这是一个前置通知

  保存User到数据库中

  这是一个异常通知

  这是一个最终通知

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。疯狂软件开设了java课程,ios课程,android课程,为你提供一个学习java技能的好机会,疯狂软件特大优惠活动,加疯狂软件微信号(疯狂软件),抢优惠,优惠100元+赠送iOS教材一本 详情请看疯狂java培训官网。IT从业着仍是社会所需要的高端人才,广州疯狂软件之力于培养企业所需要的中高端IT人才,让你成为备受企业青睐的人才。

原文地址:https://www.cnblogs.com/gojava/p/3498977.html