java基础--实现类似Spring的可配置的aop框架

首先说明这里的例子是参照张孝祥老师讲解的知识而写的,再次感谢张老师!


先上个图片,文件结构图:






package proxy.aopFramework;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import proxy.Advice;

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(
				/*	Collection.class.getClassLoader(), */
					target.getClass().getClassLoader(),
				/*	new Class[]{Collection.class}, */
					target.getClass().getInterfaces(),
					new InvocationHandler(){
					@Override
						public Object invoke(Object proxy, Method method, Object[] args)
								throws Throwable {
							advice.beforeMethod(proxy,method);  //前置通告
							Object retVal=method.invoke(target, args);
							advice.afterMethod(proxy,method);	//后置通告
							return retVal;
							
							
						}
					}
					
					);
			return proxy;
	}
}

package proxy.aopFramework;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import proxy.Advice;

public class BeanFactory {

	Properties properties=new Properties();
	public BeanFactory(InputStream ips){
		try {
			properties.load(ips);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public Object getBean(String name){
		//拿到类名
		String className=properties.getProperty(name);
		Object bean=null;
		try {
			Class clazz=Class.forName(className);
			bean=clazz.newInstance();//调用不带参数的构造方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		if(bean instanceof ProxyFactoryBean ){
			Object proxy=null;
			
			try {
				ProxyFactoryBean proxyFactoryBean=(ProxyFactoryBean)bean;
				Advice advice =(Advice) Class.forName( properties.getProperty(name+".advice")).newInstance();
				Object target=(Object) Class.forName( properties.getProperty(name+".target")).newInstance();
				proxyFactoryBean.setAdvice(advice);
				proxyFactoryBean.setTarget(target);
				
				
				proxy=((ProxyFactoryBean)bean).getProxy();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return proxy;
		}
		return bean;
	}
	
	
	
	
}

package proxy.aopFramework;

import java.io.InputStream;

public class AopFrameworkTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		InputStream ips=AopFrameworkTest.class.getResourceAsStream("aopframeworkconfig.properties");
		Object bean=new BeanFactory(ips).getBean("test");
		System.out.println(bean.getClass().getName());
	}

}



下面是aopframeworkconfig.properties的内容
test=java.util.ArrayList
#test=proxy.aopFramework.ProxyFactoryBean
test.advice=proxy.MyAdvice
test.target=java.util.ArrayList




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值