ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 软件工程 >> 仿hibernate,spring框架手动写

仿hibernate,spring框架手动写(2/2)

来源:网络整理     时间:2015-12-17     关键词:线程池,Spring,Exception,Annotation

本篇文章主要介绍了"仿hibernate,spring框架手动写",主要涉及到线程池,Spring,Exception,Annotation方面的内容,对于软件工程感兴趣的同学可以参考一下: 最近学习了hibernate底层技术和Spring 的底层技术,觉得很不错,所以想分享下,要是说的不够详细,可以去下载资源自己查看下载链接技术的体现是在实际中的...

1,刚开始时候,将事务处理写在这一层,但是对于单个的函数的,每一个需要写,代码太繁琐了,所以直接将从servlet转到service的时候(切面技术),采用代理模式代理一下,在代理模式里面,我们采用进行事物处理,需要的我们拦截进行事物处理,不需要的,我们直接放行,做他自己的事情。

    2,在使用代理模式的时候,为了让外面注入不需要强转,proxy里面采用了泛型的引入。

具体代码呈上:

public class Tx implements InvocationHandler{
	private Object srcobj;
	private Object returnValue;
	public Tx(Object srcobj) {
		this.srcobj=srcobj;
	}
	//这里写的是通用版本,代理模式
	//这个需要强转,所以引入了下面的那个不需要强转
//	public static Object getProxy(Object srcobj){
//		Object o =Proxy.newProxyInstance(
//				Tx.class.getClassLoader(), 
//				srcobj.getClass().getInterfaces(),
//				new Tx(srcobj));
//		return o;
//	}
	/*
	 * 下面这个是升级版本,返回的类型不用强转
	 */
	public static T getProxy(Object srcobj){
		Object o =Proxy.newProxyInstance(
				Tx.class.getClassLoader(), 
				srcobj.getClass().getInterfaces(),
				new Tx(srcobj));
		return (T)o;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//所有的代理在这里开始
			Connection con=null;

			if(method.isAnnotationPresent(MyTrans.class)){//这里采用注解的方式来区别是都需要进行事物处理
				System.out.println("被拦截了");
				try { 
				 con =hibernateFactory2.getCon();
				 con.setAutoCommit(false);
				 returnValue=method.invoke(srcobj, args);//调用被代理的自己去执行
				 con.commit();
				System.out.println("事物提交成功");
			} catch (Exception e) {
				try {
					System.out.println("回滚了"+e.getMessage());
					con.rollback();
				}catch (SQLException e1) {
					throw  new RuntimeException("回滚失败"+e.getMessage());
				}
			}finally{
				try {
					con.setAutoCommit(true);
					con.close();//这里关闭,是还回池中,采用代理模式修改过
				}catch (SQLException e) {
					throw new RuntimeException("关闭数据库连接失败11"+e.getMessage());
				}
			}

		}else{
			System.out.println("不拦截,放行!!");
			return method.invoke(srcobj, args);
		}
		return returnValue;
	}

}

这是自己写的注解类

package cn.hncu.publs.tx;

import java.lang.Annotation.ElementType;
import java.lang.Annotation.Retention;
import java.lang.Annotation.RetentionPolicy;
import java.lang.Annotation.Target;

@Retention(RetentionPolicy.RUNTIME)//作用于运行时,默认在编译器
@Target(value=ElementType.METHOD)//作用于方法
public @interface MyTrans {
}

源代码已上传下载链接

欢迎各位大神指点

以上就介绍了仿hibernate,spring框架手动写,包括了线程池,Spring,Exception,Annotation方面的内容,希望对软件工程有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_249996_2.html

相关图片

相关文章