您的位置:首页 > 职场人生

《黑马程序员》 动态代理之Aop框架的实现

2014-04-27 23:52 603 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐