本篇文章主要介绍了"仿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