《黑马程序员》 动态代理之Aop框架的实现
2014-04-27 23:52
676 查看
package cn.itheima.day427.aopframework; import java.lang.reflect.Method; public interface Advice { void beginTime(Method method); void endTime(Method method); } package cn.itheima.day427.aopframework; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class BeanFactory { //标准类就直接返回这个类的对象 //代理的类就创建这个类的代理。然后返回这个代理对象 private Properties prop=new Properties(); public BeanFactory(InputStream is){ try { prop.load(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Object getBean(String name){ Object bean=null; try { //返回bean对象 Class clazz=Class.forName(prop.getProperty(name)); bean=clazz.newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(bean instanceof ProxyFactoryBean){ //特殊的bean的处理 Object proxy=null; try { ProxyFactoryBean proxyBean=(ProxyFactoryBean)bean; //获取advice和target对象 Advice advice=(Advice)Class.forName(prop.getProperty(name+".advice")).newInstance(); Object target=Class.forName(prop.getProperty(name+".target")).newInstance(); proxyBean.setAdvice(advice); proxyBean.setTarget(target); proxy = proxyBean.getProxy(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return proxy; } return bean; } } package cn.itheima.day427.aopframework; import java.lang.reflect.Method; import java.util.Random; import java.util.concurrent.TimeUnit; public class MyAdvice implements Advice { private long beginTime; @Override public void beginTime(Method method) { try { beginTime = System.currentTimeMillis(); TimeUnit.SECONDS.sleep(new Random().nextInt(5) + 1); } catch (Exception e) { // TODO: handle exception } } @Override public void endTime(Method method) { long endTime=System.currentTimeMillis(); System.out.println(method.getName()+"运行了:"+(endTime-beginTime)/1000+"秒"); } } package cn.itheima.day427.aopframework; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactoryBean { private Advice advice; private Object target; 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; } public Object getProxy() { // 返回产生的代理类对象 Object proxy = Proxy.newProxyInstance(target.getClass() .getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advice.beginTime(method); //面向切面的编程 Object retVal=method.invoke(target, args); advice.endTime(method); return retVal; } }); return proxy; } } package cn.itheima.day427.aopframework; import java.io.InputStream; public class AopFrameworkDemo { /** * @param args */ public static void main(String[] args) { InputStream is=AopFrameworkDemo.class.getResourceAsStream("config.properties"); Object bean=new BeanFactory(is).getBean("xxxx"); System.out.println(bean.getClass().getName()); //代理对象怎么有返回 } } #xxxx=java.util.ArrayList xxxx=cn.itheima.day427.aopframework.ProxyFactoryBean xxxx.advice=cn.itheima.day427.aopframework.MyAdvice xxxx.target=java.util.ArrayList
相关文章推荐
- 黑马程序员--09.动态与代理AOP--06【动态代理实例化的过程升级--目标对象+系统功能的参数化】【实现类似Spring的可配置AOP框架】
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- 黑马程序员——用动态生成类实现类似于spring的可配置的AOP框架
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- .Net 框架实现AOP(动态代理实现AOP,本文为翻译)
- 黑马程序员_高新技术四(Java动态代理、AOP简单框架)
- 基础加强____【动态代理 & AOP】【实现类Spring的AOP框架】
- 黑马程序员--代理+AOP--实现一个类似spring的可配置的简单AOP框架
- Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
- 黑马程序员-高新技术-动态代理及AOP框架
- 黑马程序员-代理、实现类似Spring的可配置AOP框架
- 黑马程序员--09.动态与代理AOP--04【推理动态代理类内部结构I】【InvocationHandler实现类的具体写法】
- Java JDK动态代理(AOP)的实现原理与使用详析
- Spring AOP的实现机制(一)----- 动态代理
- AOP实现--JDK中的动态代理和cglib代理
- Spring 容器AOP的实现原理——动态代理
- Java实现动态代理实现AOP
- AOP的底层实现-CGLIB动态代理和JDK动态代理
- Java动态代理三——模拟AOP实现
- 反射实现 AOP 动态代理模式