六部分组成:
1.BeanFactory:
package com.franky.aopframework;
import java.io.InputStream;
import java.util.Properties;
import com.franky.proxy.MyAdvice;
/**
* @描述 Bean工厂,用来返回实体bean,或者代理bean
* @作者 franky
* @日期 2015-1-3 上午11:00:10
*
*/
public class BeanFactory {
Properties props = new Properties();
private InputStream ips;
/** 获取代理Bean或者实体Bean
* @param ips 配置文件的输入流
*/
public BeanFactory(InputStream ips){
this.ips = ips;
}
public Object getBean(String name){
Object bean = null;
try {
props.load(this.ips);
String className = props.getProperty(name);
bean = Class.forName(className).newInstance();
//如果该bean为动态代理bean那么返回动态代理类
if(bean instanceof ProxyBeanFactory){
Object proxy = null;
ProxyBeanFactory ProxyBean = (ProxyBeanFactory)bean;
Object target = Class.forName(props.getProperty(name+".target")).newInstance();
MyAdvice advice = (MyAdvice) Class.forName(props.getProperty(name+".advice")).newInstance();
ProxyBean.setAdvice(advice);
ProxyBean.setTarget(target);
proxy = ProxyBean.getProxy();
return proxy;
}
} catch (Exception e) {
e.printStackTrace();
}
//如果不是动态代理,那么直接返回该bean
return bean;
}
}
2.ProxyBeanFactory:
package com.franky.aopframework;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.franky.proxy.MyAdvice;
/**
* @描述 生成动态代理类的Bean工厂
* @作者 franky
* @日期 2015-1-3 上午11:05:38
*
*/
public class ProxyBeanFactory {
/**
* 目标类
*/
private Object target;
/**
* 插入的系统功能
*/
private MyAdvice advice;
/** 生成代理类,并插入系统功能
* @return 生成并返回目标类的代理类
*/
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.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
});
return proxy;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public MyAdvice getAdvice() {
return advice;
}
public void setAdvice(MyAdvice advice) {
this.advice = advice;
}
}
3.Advice子类:
package com.franky.proxy;
import java.lang.reflect.Method;
/**
* @描述 Advice接口的实现类,在调用动态代理方法前后调用
* @作者 franky
* @日期 2015-1-2 下午2:01:48
*
*/
public class MyAdvice implements Advice {
private long beginTime;
@Override
public void beforeMethod(Method method) {
beginTime = System.currentTimeMillis();
System.out.println("调用方法前...");
}
@Override
public void afterMethod(Method method) {
long endTime = System.currentTimeMillis();
System.out.println(method.getName()+":"+(endTime - beginTime));
System.out.println("调用方法后....");
}
}
4.Advice接口:
package com.franky.proxy;
import java.lang.reflect.Method;
/**
* @描述 调用代理类执行方法前后的功能方法接口
* @作者 franky
* @日期 2015-1-2 下午2:00:20
*
*/
public interface Advice {
/** 代理类执行方法前调用
* @param method 传递的代理方法
*/
void beforeMethod(Method method);
/** 代理类执行方法后调用
* @param method 传递的代理方法
*/
void afterMethod(Method method);
}
5.配置文件config.properties:
#config files
xxx=java.util.ArrayList
#xxx=com.franky.aopframework.ProxyBeanFactory
xxx.target=java.util.ArrayList
xxx.advice=com.franky.proxy.MyAdvice
6.测试主类GetBeanTest:
package com.franky.aopframework;
import java.io.InputStream;
/**
* @描述 测试AOP框架
* @作者 franky
* @日期 2015-1-3 上午11:34:42
*
*/
public class GetBeanTest {
public static void main(String[] args) {
InputStream ips = GetBeanTest.class.getResourceAsStream("config.properties");
Object bean = new BeanFactory(ips).getBean("xxx");
//动态地改变配置文件中的配置,得到代理类或目标类
System.out.println(bean.getClass().getName());
}
}