您的位置:首页 > 运维架构

动态代理的实现3-实现aop功能的封装和配置

2013-11-28 20:29 561 查看


[java] view
plaincopy

//一个通告或建议的接口  

public interface Advice {  

    void afterMethod(Method method);  

    void beforeMethod(Method method);  

}  

[java] view
plaincopy

public class MyAdvice implements Advice{  

    private long start;  

    @Override  

    public void afterMethod(Method method) {  

        System.out.println("运行时间计算结束!!");  

        System.out.println("共耗时:"+(System.currentTimeMillis()-start));  

        System.out.println("------------------------");  

    }  

  

    @Override  

    public void beforeMethod(Method method) {  

        System.out.println("开始计算运行时间:");  

        start=System.currentTimeMillis();  

        System.out.println("所执行的方法:"+method.getName());  

    }  

}  

[java] view
plaincopy

Properties文件的配置  

#xxx=java.util.ArrayList  

xxx=aopframework.ProxyFactoryBean  

xxx.advice=aopframework.MyAdvice  

xxx.target=java.util.ArrayList  

[java] view
plaincopy

/** 

 * 负责创建目标类或代理类的实例对象,并通过配置文件实现切换 

 * 

 */  

public class BeanFactory {  

    private Properties prop;  

    public BeanFactory(InputStream is){  

        prop=new Properties();  

        try {prop.load(is);  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

    public Object getBean(String propkey){  

        String className=prop.getProperty(propkey);  

        Object bean=null;  

        try {  

            bean=Class.forName(className).newInstance();  

            if(bean instanceof ProxyFactoryBean){  

                String adviceName=prop.getProperty(propkey+".advice");  

                String targetName=prop.getProperty(propkey+".target");  

                try {  

                    Advice advice = (Advice) Class.forName(adviceName).newInstance();  

                    Object target = Class.forName(targetName).newInstance();  

                    ProxyFactoryBean beanproxy=(ProxyFactoryBean)bean;  

                    beanproxy.setAdvice(advice);  

                    beanproxy.setTarget(target);  

                    bean=beanproxy.getProxy();  

                } catch (Exception e) {  

                    e.printStackTrace();  

                }  

            }  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

        return bean;  

    }  

}  

[java] view
plaincopy

/** 

 * 充当封装生成动态代理的工厂 

 */  

public class ProxyFactoryBean {  

    private Advice advice;  

    private Object target;  

    public Object getProxy() {  

        Object coll=(Object) Proxy.newProxyInstance(  

                target.getClass().getClassLoader(),   

                target.getClass().getInterfaces(),   

                new InvocationHandler(){  

                    @Override  

                    public Object invoke(Object proxy, Method method,  

                            Object[] args) throws Throwable {  

                        advice.beforeMethod(method);  

                        Object obj=method.invoke(target, args);  

                        advice.afterMethod(method);  

                        return obj;  

                    }  

                });  

        return coll;  

    }  

    public Advice getAdvice() {  

        return advice;  

    }  

    public void setAdvice(Advice advice) {  

        this.advice = advice;  

    }  

    public Object getTarget() {  

        return target;  

    }  

    public void setTarget(Object target) {  

        this.target = target;  

    }  

}  

[java] view
plaincopy

public class Test {  

    public static void main(String[] args) {  

        InputStream is=Test.class.getClassLoader().getResourceAsStream("config.properties");  

        BeanFactory factory=new BeanFactory(is);  

        Collection coll=(Collection) factory.getBean("xxx");  

        coll.add("aaa");  

        coll.add("222");  

        System.out.println(coll.size());  

    }  

    /** 

     * 运行结果 

               开始计算运行时间: 

        所执行的方法:add 

        运行时间计算结束!! 

        共耗时:0 

        ------------------------ 

        开始计算运行时间: 

        所执行的方法:add 

        运行时间计算结束!! 

        共耗时:0 

        ------------------------ 

        开始计算运行时间: 

        所执行的方法:size 

        运行时间计算结束!! 

        共耗时:0 

        ------------------------ 

        2 

     */  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息