JAVA之AOP
2018-06-18 02:51:58来源:未知 阅读 ()
AOP(面向切面编程),官方定义就不讲了,可自行百度。按照我自己的理解就是,将代码片段动态的注入某一个已知的代码片段某一处。这样做的好处就是,在不改变原有代码情况下,又能扩充原有业务的功能。
AOP有两种实现方式:
1.动态代理
例子:
假设我们向给一个类的方法入口和出口各打印一行日志,但我们又不能改变原有代码
接口:
package com; public interface AlgorithmItf { void add(); void del(); void update(); void find(); }
实现:
package com; public class Algorithm implements AlgorithmItf { public void add() { System.out.println("add..."); } public void del() { System.out.println("del..."); } public void update() { System.out.println("update..."); } public void find() { System.out.println("find..."); } }
实现面向切面注入
package com; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AopDyProxy<T> implements InvocationHandler { private T o; public T createInstance(T t) { o=t; return (T)(Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this)); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object re=null; System.out.println(method.getName()+" enter"); re=method.invoke(o, args); System.out.println(method.getName()+" exit"); return re; } public static void main(String[] args) { AopDyProxy<AlgorithmItf> p=new AopDyProxy<AlgorithmItf>(); AlgorithmItf a=p.createInstance(new Algorithm()); a.add(); a.update(); } }
测试结果输出
add enter
add...
add exit
update enter
update...
update exit
2.静态代理,直接上例子了(摘自网络)
/** * 静态代理可通过接口或者类进行代理 * */ public class StaticProxyTest { public static void main(String[] args) { //基于接口 MyPhone myPhone = new MyPhoneImpl(); StaticProxy proxy = new StaticProxy(myPhone); proxy.name("华为"); //基于类 MyPhoneClass myPhoneClass = new MyPhoneClass(); ProxyEntity entity = new ProxyEntity(myPhoneClass); entity.name("小米"); } } /** * 接口 * */ interface MyPhone{ public void name(String str); } /** * 接口实现类 * @author Administrator * */ class MyPhoneImpl implements MyPhone{ @Override public void name(String str) { System.out.println("早上好"+str); } } /** * 自定义静态代理类 * @author Administrator * */ class StaticProxy implements MyPhone{ MyPhone myPhone; public StaticProxy(MyPhone myPhone) { this.myPhone = myPhone; } @Override public void name(String str) { beforeFun(); myPhone.name(str); afterFun(); } public void beforeFun(){ System.out.println("前置代理"); } public void afterFun(){ System.out.println("后置代理"); } } /** * 实体类 * @author Administrator * */ class MyPhoneClass{ public void name(String str){ System.out.println("基于类实现:"+str); } } /** * 基于类的代理 * @author Administrator * */ class ProxyEntity extends MyPhoneClass{ MyPhoneClass myPhone; public ProxyEntity(MyPhoneClass myPhone) { this.myPhone = myPhone; } @Override public void name(String str) { beforeFun(); myPhone.name(str); afterFun(); } public void beforeFun(){ System.out.println("前置代理"); } public void afterFun(){ System.out.println("后置代理"); } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:eclipse指定jdk版本
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash