仿hibernate,spring框架手动写
近期学习了hibernate底层技术和spring 的底层技术,认为非常不错,所以想分享下
,要是说的不够具体。能够去下载资源自己查看下载链接
技术的体现是在实际中的。如今大体介绍一下吧
首先介绍hibernate手动写:
仿HIBERNATE
hibernate是属于DAO,专门又来管理数据的,connection中还要考虑多线程的情况。同一个线程还要必需要是同样的connection对象。这就需要ThreadLocal来实
现。
1,connection考虑须要多线程,须要採用多例模式来实现,
2。读取配置文件,如真的hibernate中的配置文件(自己写的仅仅有mysqld的)
3,当须要进行事物处理的时,须要採用同一个connection对象。须要用到ThreadLocal对象进行设置
4。当connection关闭时,而不是直接关闭,仅仅是将其还回线程池中。
详细代码呈上:
<span style="font-size: 18px;">
/*
* 我们须要採用线程池避免线程冲突。多例模式----》获得时候须要上锁
* pool中的数量是有限的,我们採用了代理模式,改动 con.close(),将连接换回来
* 为了保证统一线程是一个用户,我们採用threadlocal本地线程技术
*/
public class hibernateFactory2 {
private static final int NUM=3;
private static List<Connection> pool =new ArrayList<Connection>();
</span><strong><span style="font-size:24px;color:#cc0000;"><u>private static ThreadLocal<Connection> t=new ThreadLocal<Connection>();//声明本地线程、</u></span></strong><span style="font-size: 18px;">
static{
</span><span style="color:#cc0000;font-size: 18px;"> <strong><u>//读取配置文件</u></strong>
Properties p =new Properties();
</span><span style="font-size: 18px;">
try {
p.load(hibernateFactory2.class.getClassLoader().getResourceAsStream("jdbc.properties"));
//读取里面的值,一直改动配置文件就可以
String driver=p.getProperty("driver");
String url=p.getProperty("url");
String user=p.getProperty("username");
String password=p.getProperty("password");
//System.out.println(driver+url+user+password);
Class.forName(driver);
for(int i=0;i<NUM;i++){
final Connection con=DriverManager.getConnection(url, user, password);
</span><span style="color:#cc0000;font-size: 18px;"><strong><em><u>//採用动态代理開始进行对connection接口实现代理,对con.close,实现换回去</u></em></strong>
Object o =Proxy.newProxyInstance(hibernateFactory2.class.getClassLoader(), new Class[]{Connection.class},
new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("close")){
pool.add((Connection)(proxy));
System.out.println("换回来了。。 。 ");
return null;
}
return method.invoke(con, args);
}
});
pool.add((Connection)o);</span><span style="font-size: 18px;">
}
// System.out.println("初始化完成"+con);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static synchronized Connection getCon() throws Exception{
/*
* <span style="color:#ff0000;"><strong><em>把自己主动会到一个它所维护的那个map中去取,把以“当前线程对象”为key所相应的那个value取出来</em></strong></span>
*/
Connection c=t.get();
if(c==null){
while(pool.size()<=0){
System.out.println("池中已经乜有连接");
Thread.sleep(1000);
}
c=pool.remove(0);//为事物处理方便了。当出现错误的时候,多表一个都不能存储。採用一个connection
t.set(c);
}
return c;
}
}
</span>
仿Spring
1,刚開始时候,将事务处理写在这一层。可是对于单个的函数的。每个须要写。代码太繁琐了,所以直接将从servlet转到service的时候(切面技术),採用代理模式代理一下,在代理模式里面,我们採用进行事物处理,须要的我们拦截进行事物处理。不须要的。我们直接放行,做他自己的事情。
2,在使用代理模式的时候。为了让外面注入不须要强转。proxy里面採用了泛型的引入。
详细代码呈上:
public class Tx implements InvocationHandler{
private Object srcobj;
private Object returnValue;
public Tx(Object srcobj) {
this.srcobj=srcobj;
}
<span style="color:#cc0000;"><strong>//这里写的是通用版本号,代理模式</strong></span>
//这个须要强转。所以引入了以下的那个不须要强转
// public static Object getProxy(Object srcobj){
// Object o =Proxy.newProxyInstance(
// Tx.class.getClassLoader(),
// srcobj.getClass().getInterfaces(),
// new Tx(srcobj));
// return o;
// }
/*
*<strong> 以下这个是升级版本号,返回的类型不用强转</strong>
*/
public static<T> 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;
<u><strong><span style="color:#ff0000;">if(method.isAnnotationPresent(MyTrans.class)){//这里採用注解的方式来差别是都须要进行事物处理</span></strong></u>
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框架初写
1.Spring的概述 a) Spring是什么 Spring是一个JavaEE轻量级的一站式 Java EE的开发框架. JavaEE: 就是用于开发B/S的程序.(企业级) 轻量级:使用最少代 ...
- maven配置spring mvc+hibernate+spring框架
作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...
- Struts2&Hibernate&Spring框架目录
第3章 Struts2框架 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架 使用目的:减少在运用MVC设计模型来开发Web应用的时间 3.1 Struts2框架概述 3.1.1 ...
- 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境
上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...
- Struts2+Spring+Hibernate 三大框架的合并集成
这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样. 首先看一 ...
- Struts 2 Spring Hibernate三大框架的执行流程以及原理
Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架.它基于当年的WebWork和XWork框架,继承其优点,同时 ...
- Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...
- hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结
最近刚开始接触hibernate+spring+mvc+Easyui框架,也是刚开通了博客,希望能记录一下自己实践出来的东西,让其他人少走弯路. 转让正题,以个人浅薄的认识hibernate对于开发人 ...
- 三大框架:Struts+Hibernate+Spring
三大框架:Struts+Hibernate+Spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...
随机推荐
- [Tailwind] Create Custom Utility Classes in Tailwind
In this lesson, we learn how to generate custom utility classes in tailwind. We add new properties t ...
- Android仿IOS的AssistiveTouch的控件EasyTouch实现
概述: 之前我听到过一则新闻,就是说Ipone中的AssistiveTouch的设计初衷是给残疾人使用的. 而这一功能在亚洲(中国)的使用最为频繁. 虽不知道这新闻的可靠性,但无庸置疑的是它的确给我们 ...
- ubuntu12.04安装翻译软件stardict及卸载
下载: 1.打开软件中心.搜索stardict,星际译王,即ubuntu下的翻译软件. 点击下载就可以. 2.打开终端,输入 $sudo apt-get install stardict 按提示就可以 ...
- iOS-UIImageView载入网络下载的图片(异步+多线程)
最原始的载入网络下载的图片方式: //最原始载入网络图片方法,相当堵塞主线程,界面卡顿 -(void)setImageWithURL:(NSString *)imageDownloadUrl{ UII ...
- Android圆角Tag控件的另类实现
一般的圆角标签控件都是用xml设置shape做实现.可是假设我们想要做一个更加强大通用的的圆角控件,不须要使用者去关心圆角,仅仅设置背景就能够了. 应该怎么实现呢?这个就须要把背景先设置成图片,然后再 ...
- hdoj--2098--分拆素数和(枚举)
分拆素数和 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- web.config or app.config 中configSections配置节点
以前还真没见过,今天看项目中有在用,简单写了个Demo,这样配置的好处就是可以自定义配置,更加模块化,直接上代码; 1.配置文件 由于我创建的是一个控制台项目,所以配置文件是App.Config:(这 ...
- mysql学习 1
1.数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 2.RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1) ...
- null和undifned的区别
null和undifned的区别 1 从类型方面:null的类型是对象,undified的类型是undified. 2 从定义方面:null是一个表示"无"的对象,转为数值时为0: ...
- Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在 ...