仿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来处理控制业务(负责对数据库的操作 ...
随机推荐
- iOS动画之美丽的时钟
1.终于效果图 2.实现思路 在ios中默认是绕着中心点旋转的,由于锚点默认在图层的中点,要想绕着下边中心点转,须要改变图层锚点的位置. 依据锚点.设置position坐标.为时钟的中点. 思考秒针旋 ...
- 杂项-DB:ETL(数据库仓库技术)
ylbtech-杂项-DB:ETL(数据库仓库技术) ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).交互转换(transfor ...
- 37.Qt网络与通信
1 获取本机网络与通信 在网络应用中,经常需要获得本机的主机名.IP地址和硬件地址等网络信息.运用QHostInfo,QNetWorkInterface,QNetworkAddressEntry可获得 ...
- crawler4j多线程爬虫统计分析数据
该事例演示了如何在多线程中统计和分析数据: 首先建一个状态实体类CrawlStat: package com.demo.collectingData; /** * 爬虫状态实体类 统计爬虫信息 * @ ...
- POJ 3150 循环矩阵的应用
思路: 首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵 由于此题是距离小于d的都加上一个数. 那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵 看看数据范围 n^2log(k)可以过. 那就 ...
- EF Code First 使用 代码优先迁移(二)
第一步:如果不是建立的MVC项目,可能需要在控制台输入 :Install-Package EntityFramework 删除之后在执行Enable-Migrations 第二步:添加你需要修改的属性 ...
- C# 3.0的新特性
自动属性. 之前定义属性的步骤: private filed + public property. 现在的形式:int id{get;set;}. 可以分别设置get/set的保护级别(protect ...
- Hibernate框架学习(八)——查询-HQL语法
一.单表查询 1.基础语法 2.排序 3.条件 4.分页 5.聚合 6.投影 二.多表查询 1.回顾原生SQL 1>交叉连接-笛卡尔积(避免)select * from A,B; 2>内连 ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- runloop的source
以上是完整的 CFRunLoop 和 CFRunLoopMode 的结构体源码(太长了我的妈,用不着看完),下面我精简一下,把重要的留下,看如下代码(可以仔细看一下,加深印象): 上面是精简出来比较关 ...