Java-----------类似spring的AOP框架的实现

原创 2012年03月25日 00:54:37

android培训java培训、期待与您交流!

        这个是在上一个视频的基础上来进行是实现的。首先就是有一个BeanFactory来进行总的整合,在这个类里面有个方法getBean参数就是传入的name,该名称在属性文件中有标记。这个方法返回一个bean或者一个代理的实例对象。

package springFrame;

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

public class BeanFactory {
	Properties pro = new Properties();
	public  BeanFactory(InputStream ips){
		try {
			pro.load(ips);//加载属性文件
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public Object getBean(String name){
		//获得这个是目标bean还是代理bean
		String className = pro.getProperty(name);
		//从属性文件中得到名字是name对应的名称
		Object bean = null;
				
		try {
			Class clazz = Class.forName(className);
			//通过这个名称获得该名称对应的类的字节码
			bean = clazz.newInstance();
			//该类进行实例化
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
			
		if(bean instanceof ProxyFactoryBean){
			//如果这个bean是代理类
			ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
			//转化为这个代理的bean
			Advice advice = null;
			Object target = null;
			try {
				advice = (Advice)Class.forName(pro.getProperty(name + ".advice")).newInstance();
				//契约实例化通过属性文件得到的名称
				target  = Class.forName(pro.getProperty(name + ".target")).newInstance();
				//目标的实例化通过属性文件中得到的名称
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			proxyFactoryBean.setTarget(target);
			//把这个目标类设置到代理类的bean中
			proxyFactoryBean.setAdvice(advice);
			//把契约类设置到代理类的bean中
			Object proxy = proxyFactoryBean.getProxy();
			//通过代理类的bean来获得这个代理的类的实例对象并返回
			return proxy;
		}
			
		return bean;
	}
}
上面的代码是BeanFactory,通过它就可以得到我们想要的是bean还是代理。

package springFrame;

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

import test.Advice;

public class ProxyFactoryBean {
	
	private Object target;//定义目标类
	private Advice advice;//定义契约
	
	public Object getProxy(){
		Object proxy3 = Proxy.newProxyInstance(//实例化一个代理
				target.getClass().getClassLoader(), //传入目标的加载器
				target.getClass().getInterfaces(), //传入目标的接口
				
				new InvocationHandler(){
					
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						advice.beforeMethod(method);//执行契约类的的before方法
						Object revalue = method.invoke(target, args);
						advice.afterMethod(method);//执行契约类的after方法
						return revalue;//返回给代理
					}
				});
		return proxy3;//返回一个代理
	}
	public Object getTarget() {//获得目标
		return target;
	}
	public void setTarget(Object target) {//设置目标
		this.target = target;
	}
	public Advice getAdvice() {//获得契约
		return advice;
	}
	public void setAdvice(Advice advice) {//设置契约
		this.advice = advice;
	}
}

       这个是代理类的生成工厂,在这个类里面我们要有两个传入的参数,才能正确的生成目标类的代理,一个是目标另外就是契约。契约是上次笔记中就有,主要是我们要加入的系统功能的实现。

然后就是测试:

package springFrame;

import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;

public class AopFrameworkTest {

	public static void main(String[] args) throws Exception,
			IllegalAccessException {

		InputStream ips = AopFrameworkTest.class
				.getResourceAsStream("config.properties");
		Object bean = new BeanFactory(ips).getBean("xxx");
		Collection c = (Collection)bean;//由于这个是代理,所以要通过接口Collection来获得
		c.add("1");
		c.size();
		System.out.println(bean.getClass().getName());
		}
}
最后测试的结果很正常,输出了这个代理类的名称和执行add的时候会把我们契约中要加入的功能也已经加入了进去。


android培训java培训、期待与您交流!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java动态代理-实现类似spring的可配置的AOP框架

工厂类BeanFactory负责创建目标类或者代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFa...

java 高新技术【11.2】 动态代理类 编写类似 AOP 与 BeanFactory。初试Spring框架

1.切面(aspect):    要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。 2.连接点:    应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的 字段。...

java 高新技术【11.2】 动态代理类 编写类似 AOP 与 BeanFactory。初试Spring框架

1.切面(aspect):    要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。 2.连接点:    应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的 字段。...

11.6实现一个类似于spring的可配置的AOP框架

p { margin-bottom: 0.21cm; } 此框架实现了再配置文件里面配置一个对象是否使用代理类说明ProxyFactoryBean类是得到Proxy对象BeanFactory类是得到...

实现类似spring的可配置的AOP框架

实现类似spring的可配置的AOP框架       工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如...

实现类似Spring的可配置的AOP框架

可配置的AOP框架中两个重要的类: BeanFactory 工厂类BeanFactory负责创建目标或代理类的实例对象,并通过配置文件进行切换,其getBean()方法根据参数字符串返回一个相应的...

实现类似于Spring的可配置的AOP框架

AopFrameworkTest.java  import java.io.InputStream; import java.util.Collection; public class Aop...

实现类似spring的可配置的AOP框架

实现类似spring的可配置的AOP框架       工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如...

【框架】[Spring]纯Java的方式实现AOP切面(拦截)技术

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 AOP理论知识介绍:面向切面编程英文名为:Aspect Oriented Progr...

【框架】[Spring]纯Java方式实现AOP拦截-详解ThrowsAdvice异常通知

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 这篇博客讲了AOP代理-通知的3种方式: 1、MethodBeforeAdvice...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)