初识AOP

   学习Spring AOP之前,先来了解一下AOP。
    AOP应用到项目中的好处,能够将与业务逻辑不相关的代码(如:日志、权限等)分离出来,减小相关业务类负担,并能让一些通用需求(如:事务)得到更广泛的复用。
AOP的实现是利用了java核心的代理机制,分静态代理与动态代理。
静态代理要求代理对象与被代理对象都实现同一个接口

Java代码 复制代码
  1. 接口:   
  2. public interface IBusiness{   
  3.     public void doBusiness();   
  4. }   
  5. 实现:   
  6. public class BusinessImpl implements IBusiness{   
  7.     public void doBusiness(){   
  8.         System.out.println("业务主体部分");   
  9.     }   
  10. }   
  11. 代理:   
  12. public class BusinessProxy implements IBusiness{   
  13.     private BusinessImple bi=null;   
  14.     public BusinessProxy(BusinessImple bi){   
  15.         this.bi=bi;   
  16.     }   
  17.     public void doBusiness(){   
  18.         System.out.println("事务、日志、权限等操作");   
  19.         bi.doBusiness();   
  20.         System.out.println("事务、日志、权限等操作");   
  21.     }   
  22. }   
  23. 应用:   
  24. public class AOPAppDemo{   
  25.     public static void main(String[] args){   
  26.         BusinessImpl bi=new BusinessImple();   
  27.         BusinessProxy proxy=new BusinessProxy(bi);   
  28.         proxy.doBusiness();   
  29.     }   
  30. }  
接口:
public interface IBusiness{
	public void doBusiness();
}
实现:
public class BusinessImpl implements IBusiness{
	public void doBusiness(){
		System.out.println("业务主体部分");
	}
}
代理:
public class BusinessProxy implements IBusiness{
	private BusinessImple bi=null;
	public BusinessProxy(BusinessImple bi){
		this.bi=bi;
	}
	public void doBusiness(){
		System.out.println("事务、日志、权限等操作");
		bi.doBusiness();
		System.out.println("事务、日志、权限等操作");
	}
}
应用:
public class AOPAppDemo{
	public static void main(String[] args){
		BusinessImpl bi=new BusinessImple();
		BusinessProxy proxy=new BusinessProxy(bi);
		proxy.doBusiness();
	}
}


    上述代码就是通过静态代理实现了AOP,BusinessProxy代理了BusinessImpl的doBusiness方法。但是静态代理一般不能满足我们项目开发的需求,如果业务需求很多它得为每一个业务方法一一做代理,动态代理正好解决了这一缺点,接下来我们来说说动态代理吧。
    动态代理,需实现一个InvocationHandler的接口,重写invoke(Object proxy,Method method,Object[] args)方法,代理对象实例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,当代理对象的方法被执行时,通知执行器(InvocationHandler)执行invoke(Object proxy,Method method,Object[] args)方法,invoke方法内调用了method.invoke(Object obj,Object... args)方法,该方法对带有指定参数的指定对象调用由此 Method 对象表示的基础方法,应该这时才真正代理执行了业务逻辑(这里我是这样理解的,不知对不对)。
    接下来用代码说明上述动态代理原理,与静态代理相比接口与实现保持不变

 

上述代码就是通过静态代理实现了AOP,BusinessProxy代理了BusinessImpl的doBusiness方法。但是静态代理一般不能满足我们项目开发的需求,如果业务需求很多它得为每一个业务方法一一做代理,动态代理正好解决了这一缺点,接下来我们来说说动态代理吧。
    动态代理,需实现一个InvocationHandler的接口,重写invoke(Object proxy,Method method,Object[] args)方法,代理对象实例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,当代理对象的方法被执行时,通知执行器(InvocationHandler)执行invoke(Object proxy,Method method,Object[] args)方法,invoke方法内调用了method.invoke(Object obj,Object... args)方法,该方法对带有指定参数的指定对象调用由此 Method 对象表示的基础方法,应该这时才真正代理执行了业务逻辑(这里我是这样理解的,不知对不对)。
    接下来用代码说明上述动态代理原理,与静态代理相比接口与实现保持不变

Java代码 复制代码
  1. 接口:   
  2. public interface IBusiness{   
  3.     public void doBusiness();   
  4. }   
  5. 实现:   
  6. public class BusinessImpl implements IBusiness{   
  7.     public void doBusiness(){   
  8.         System.out.println("业务主体部分");   
  9.     }   
  10. }   
  11. 执行器:   
  12. public class BusinessHandler implements InvocationHandler{   
  13.     private BusinessImpl bi=null;   
  14.     public BusinessHandler(BusinessImpl bi){   
  15.         this.bi=bi;   
  16.     }   
  17.     public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{   
  18.         System.out.println("事务、日志、权限等操作");   
  19.         method.invoke(bi,args);   
  20.         System.out.println("事务、日志、权限等操作");   
  21.     }   
  22.     }   
  23. }   
  24. 应用:   
  25. public class AOPAppDemo{   
  26.     public static void main(String[] args){   
  27.         BusinessImple bi=new BusinessImple();   
  28.         BusinessHandler bh=new BusinessHandler(bi);   
  29.         IBusiness proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh);   
  30.                   proxy.doBusiness();   
  31.     }   
  32. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值