java架构解密——用接口改造AOP
来源:互联网 发布:淘宝客api使用教程 编辑:程序博客网 时间:2024/06/05 05:41
优化是个无止境的工作,在AOP的路上,我们走得很远,但是还有很多的工作,我们没有做,比如,将aop的业务部分封装成容器,将aop的服务部分改造成面向接口的,这样就不受具体的形式上的限制了!这样AOP的优化,就又前进了一步,也是符合咱们的面向接口编程的思想,下面就和我一起研究下如何将接口的思想融入到aop的实现中。
回顾:
在上篇博客中,我们将aop的服务封装到了容器中:
这样的好处就是我们可以使用配置文件扩展服务类,服务类不再受限于具体的形式与方法,而我们封装的服务类和动态代理,构成了这样的一个AOP实现:
而这样的实现,我们还要依赖具体的容器,不利于我们扩展,如果我们想换容器怎么办?我们就要重构我们的代码,这不是我们程序设计中想要的,我们可以利用接口来屏蔽掉具体容器的使用,让aop可以定制容器,如何实现?其实很简单,大家看:
1,类图改造
2,公共服务接口:
public interface IProxyMehds { public void beforeBean(); public void afterBean(); }3,公共服务容器类:
public class ProxyMehds implements IProxyMehds {//盛放方法执行前的对象的容器private HashMap<String,Object> beforBeans; private HashMap<String,Object> afterBeans; //配制方法执行前要执行哪些方法private HashMap<String,String> beforMethods; private HashMap<String,String> afterMethods; public void beforeBean() { try{ for (HashMap.Entry<String, Object> entry : beforBeans.entrySet()) { String objectKey = entry.getKey(); Object objectValure = entry.getValue(); Method beforMehod = objectValure.getClass().getMethod(beforMethods.get(objectKey)); beforMehod.invoke(objectValure); } }catch(Exception ex){ ex.printStackTrace(); } //Method sAge = c.getMethod("setAge"); } public void afterBean() { try{ for (HashMap.Entry<String, Object> entry : afterBeans.entrySet()) { String objectKey = entry.getKey(); Object objectValure = entry.getValue(); Method beforMehod = objectValure.getClass().getMethod(afterMethods.get(objectKey)); beforMehod.invoke(objectValure); } }catch(Exception ex){ ex.printStackTrace(); } }public HashMap<String, Object> getBeforBeans() {return beforBeans;}public void setBeforBeans(HashMap<String, Object> beforBeans) {this.beforBeans = beforBeans;}public HashMap<String, Object> getAfterBeans() {return afterBeans;}public void setAfterBeans(HashMap<String, Object> afterBeans) {this.afterBeans = afterBeans;}public HashMap<String, String> getBeforMethods() {return beforMethods;}public void setBeforMethods(HashMap<String, String> beforMethods) {this.beforMethods = beforMethods;}public HashMap<String, String> getAfterMethods() {return afterMethods;}public void setAfterMethods(HashMap<String, String> afterMethods) {this.afterMethods = afterMethods;}}
3,客户端
客户端代码并没有发生任何变化:
public class Client {public static void main(String[] args) { HashMap<String,Object> beforBeans; HashMap<String,Object> afterBeans;HashMap<String,String> beforMethods; HashMap<String,String> afterMethods; beforMethods=new HashMap(); beforBeans=new HashMap(); beforBeans.put("AspectClass1", new AspectClass1()); beforBeans.put("AspectClass2", new AspectClass2()); beforMethods.put("AspectClass1", "SayHello"); beforMethods.put("AspectClass2", "SayGoodBye"); afterMethods=new HashMap(); afterBeans=new HashMap(); afterBeans.put("AspectClass3", new AspectClass3()); afterBeans.put("AspectClass4", new AspectClass4()); afterMethods.put("AspectClass3", "SayHi"); afterMethods.put("AspectClass4", "Eat"); ProxyMehds proxyMehds =new ProxyMehds(); proxyMehds.setBeforBeans(beforBeans); proxyMehds.setBeforMethods(beforMethods); proxyMehds.setAfterBeans(afterBeans); proxyMehds.setAfterMethods(afterMethods); //实例代理类 CGLibDynamicProxy cglib =CGLibDynamicProxy.getInstance(); //接受切面 cglib.setProxyMehds(proxyMehds); //接受要代理的对象 Greeting greeting = cglib.getProxy(GreetingImpl.class); //执行对象的某个方法 greeting.sayHello("Jack"); } }
总结:
大家看看这一路的变化,我们不难发现,在我们的AOP优化之路上,我们走得和其他博客不太一样,我们在这里实际就做了一件事,将耦合解开,将解开耦合的类封装到容器中,将容器抽象为一个接口,这样的道路,是不是和哪些理念靠近了呢?对?就是咱们的设计模式,在设计模式中,我们抽象了23种设计模式,其实就是为了解耦和,然后将耦合封装到运行时装配!
大道至简,在优化的道路上,比较好的指导思想就是简化,傻瓜化,就像蜂群一样,每个蜜蜂做一件简单的事情,一个蜂群就可以完成一个极其复杂的社会活动!
1 0
- java架构解密——用接口改造AOP
- java架构解密——Spring框架的AOP
- java架构解密——AOP之动态代理实现
- java架构解密——深入再造AOP
- java架构解密——双容器优化aop
- java架构解密——实时动态aop
- java架构解密——Spring框架的AOP:参数操作
- 微服务改造—架构设计
- 阿里双十一微服务改造—架构设计
- 【java】SSM架构改造为dubbo分布式架构
- JAVA接口代理实现AOP
- Spring—AOP的ThrowsAdvice接口问题
- java架构解密——Spring框架的ioc自我实现
- .NET架构改造
- java安全架构____java DSA加密解密
- java安全架构____DES加密解密
- java安全架构____RSA加密解密
- Java Runnable 接口具体代码解密
- php学习随记1
- PHP fsockopen模拟发送post set请求
- 初识Java
- 机器学习-生成学习算法
- winform窗体间传值
- java架构解密——用接口改造AOP
- OC基础学习——字典和可变字典
- 【应用篇】Activiti监听与业务颗粒结合的简单应用(一)
- Debug记录
- 分部类和命名空间
- 用迪杰斯特拉算法实现地铁的站点搜索
- 使用Gdb+qemu调试内核:
- Python之学习笔记(面向对象编程)
- WIN7 删除文件夹或文件提示文件不存在解决方法