黑马程序员_模拟Spring可配置的AOP框架

------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
BeanFactory 工厂类BeanFactory提供了getBean(String name)的方法,可根据name来判断创建目标类还是代理类的实例对象 name为配置文件中参数字符串,如果name对应的是目标类,则直接创建目标类实例对象; 若对应的为ProxyFactoryBean,则返回该类实例对象的getProxy方法返回的对象; 该类需要查看配置文件数据,则构造函数需传入一个输入流,且内部封装有Properties集合。 ProxyFactoryBean 在此文中直接将其编写为类了,它含有target和advice两个属性,另提供一个getProxy方法, 该方法就是提供的就是目标类+系统功能的代理类实例对象 config 配置文件,其格式如下,此文仅演示一个示例 #xxx=java.util.ArrayList xxx=cn.ithema.day3.aopframework.ProxyFactoryBean xxx.advice=cn.ithema.day3.MyAdvice xxx.target=java.util.ArrayList AopFrameworkTest 此文用其作为框架测试类,通过该类加载器获取加载配置文件的流,借此流new工厂类对象, 由该对象getBean方法获取对象,通过更改配置文件名获取目标类或者代理类。
/* 实现类似spring的可配置的Aop框架
 * */
package cn.ithema.day3.aopframework_1;
import java.io.InputStream;
public class AopFrameworkTest {
	public static void main(String[] args) {
		//获取具有给定名称的资源
		InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
		//获取bean实例,可通过配置文件更改获取目标类还是代理类
		Object bean = new BeanFactory(ips).getBean("xxx");
		System.out.println(bean.getClass().getName());
	}
}
package cn.ithema.day3.aopframework_1;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import cn.ithema.day3.Advice;
import cn.ithema.day3.aopframework.ProxyFactoryBean;
public class BeanFactory {
	//内部封装可加载流集合
	private Properties props = new Properties();
	//构造函数
	BeanFactory(InputStream ips){
		try {
			props.load(ips);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	//getBean方法,两种情况
	public Object getBean(String name){
		//更具提供参数字符串获取类名
		String className = props.getProperty(name);
		//通过反射用类名创建无参对象
		Object bean = null;
		try {
			Class<?> clazz = Class.forName(className);
			bean = clazz.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		//若bean为ProxyFactoryBean类,则设置target、advice然后调用getBean方法
		if(bean instanceof ProxyFactoryBean){
			ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean) bean;
			//获取advice和target
			Advice advice = null;
			Object target = null;
			try {
				advice = (Advice)Class.forName(props.getProperty(name+".advice")).newInstance();
				target = Class.forName(props.getProperty(name+".target")).newInstance();
			} catch (Exception e) {
				e.printStackTrace();
			}
			//为该代理类设置属性
			proxyFactoryBean.setAdvice(advice);
			proxyFactoryBean.setTarget(target);
			//获取代理类实例
			Object proxy = proxyFactoryBean.getProxy();
			return proxy;
		}
		//如bean为目标类,则直接返回实例对象
		return bean;
	}
}
package cn.ithema.day3.aopframework_1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.ithema.day3_1.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(
			target.getClass().getClassLoader(), 
			target.getClass().getInterfaces(), 
			new InvocationHandler() {
				@Override
				public Object invoke(Object obj, Method method, Object[] args)
						throws Throwable {
					advice.beforeMethod(method);
					Object retVal = method.invoke(target, args);
					advice.afterMethod(method);
					return retVal;
				}
			});
		return proxy;
	}
}
配置文件
#xxx=java.util.ArrayList
xxx=cn.ithema.day3.aopframework.ProxyFactoryBean
xxx.advice=cn.ithema.day3.MyAdvice
xxx.target=java.util.ArrayList


------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.youkuaiyun.com/heima/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值