------------- 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/
黑马程序员_模拟Spring可配置的AOP框架
最新推荐文章于 2024-10-09 23:59:05 发布