实现AOP功能的封装与配置
工厂类BeanFactory负责创建目标类或者代理类的实例对象,并通过配置文件
实现切换,其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串
在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,
否则,返回该类实例对象的getProxy方法,返回一个代理对象
BeanFactory的构造方法接受代表配置文件的输入流对象,配置文件格式如下
#xxx= java.util.ArrayList
xxx= com.sdut.ProFactoryBean
xxx.target= java.util.ArrayList
xxx.advice= com.sdut.MyAdvice
ProxyFactoryBean充当动态生成代理的工厂,需要为工厂提供目标,和通知
程序如下:
BeanFactory.java bean工厂
publicclass BeanFactory {
//创建配置文件对象
Propertiesprop = new Properties();
publicBeanFactory(InputStream ips){
try{
prop.load(ips);
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
publicObject getBean(String name){
StringclassName = prop.getProperty(name);
//创建className的字节码对象
Object obj;
try{
Classclazz = Class.forName(className);
//创建字节码对象所对应类的实例
obj= clazz.newInstance();
if(objinstanceof ProxyFactoryBean){
//为代理工厂送去目标,和消息
ProxyFactoryBeanproxyFactoryBean = (ProxyFactoryBean)obj;
//获取advice,target;
MyAdviceadvice = (MyAdvice)Class.forName(prop.getProperty(name +".advice")).newInstance();
Objecttarget = Class.forName(prop.getProperty(name +".target")).newInstance();
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
//开始创建代理对象
Objectproxy = proxyFactoryBean.getProxy();
returnproxy;
}
else{
returnobj;
}
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
returnnull;
}
}
ProxyFactoryBean.java 代理工厂
publicclass ProxyFactoryBean {
privateObject target ;
privateAdvice advice;
publicObject getTarget() {
returntarget;
}
publicvoid setTarget(Object target) {
this.target= target;
}
publicAdvice getAdvice() {
returnadvice;
}
publicvoid setAdvice(Advice advice) {
this.advice= advice;
}
publicObject getProxy(){
Objectproxy3 = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),newInvocationHandler(){
@Override
publicObject invoke(Object proxy, Method method,
Object[]args) throws Throwable {
advice.getBeginTime(method);
ObjectretVal = method.invoke(target, args);
advice.getEndTime(method);
returnretVal;
}
});
returnproxy3;
}
}
测试类AopFrameworkTest.java
publicclass AopFramewrokTest {
publicstatic void main(String[] args) throws IOException {
//读取配置文件
InputStreamips =AopFramewrokTest.class.getResourceAsStream("config.properties");
Objectobj = new BeanFactory(ips).getBean("xxx");
System.out.println(obj.getClass().getName());
ips.close();
Collectioncollection = (Collection)obj;
collection.add("kk");
}
}