码迷,mamicode.com
首页 > 编程语言 > 详细

java架构解密——用接口改造AOP

时间:2015-06-20 00:21:31      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

        优化是个无止境的工作,在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种设计模式,其实就是为了解耦和,然后将耦合封装到运行时装配!

       大道至简,在优化的道路上,比较好的指导思想就是简化,傻瓜化,就像蜂群一样,每个蜜蜂做一件简单的事情,一个蜂群就可以完成一个极其复杂的社会活动!


java架构解密——用接口改造AOP

标签:

原文地址:http://blog.csdn.net/xvshu/article/details/46288953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!