近期学习了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框架手动写的更多相关文章

  1. Spring框架初写

    1.Spring的概述 a)   Spring是什么 Spring是一个JavaEE轻量级的一站式 Java EE的开发框架. JavaEE: 就是用于开发B/S的程序.(企业级) 轻量级:使用最少代 ...

  2. maven配置spring mvc+hibernate+spring框架

    作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...

  3. Struts2&Hibernate&Spring框架目录

      第3章 Struts2框架 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架 使用目的:减少在运用MVC设计模型来开发Web应用的时间 3.1 Struts2框架概述 3.1.1 ...

  4. 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境

    上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...

  5. Struts2+Spring+Hibernate 三大框架的合并集成

    这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一 ...

  6. Struts 2 Spring Hibernate三大框架的执行流程以及原理

    Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架.它基于当年的WebWork和XWork框架,继承其优点,同时 ...

  7. Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...

  8. hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结

    最近刚开始接触hibernate+spring+mvc+Easyui框架,也是刚开通了博客,希望能记录一下自己实践出来的东西,让其他人少走弯路. 转让正题,以个人浅薄的认识hibernate对于开发人 ...

  9. 三大框架:Struts+Hibernate+Spring

    三大框架:Struts+Hibernate+Spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...

随机推荐

  1. Hadoop使用Java进行文件修改删除操作

    Hadoop使用Java进行文件修改删除操作 学习了:http://blog.csdn.net/menghuannvxia/article/details/44651061 学习了:http://bl ...

  2. bram和dram差别

    选择distributed memory generator和block memorygenerator标准: Dram和bram差别: 1.bram 的输出须要时钟,dram在给出地址后既可输出数据 ...

  3. OpenStack Heat总结之:Icehouse中通过Heat+Ceilometer实现Autoscaling

    在I版本号中,Heat中加入了对于AutoScaling资源的支持.github上也提供了相应的AutoScaling的模板(https://github.com/openstack/heat-tem ...

  4. 单机 &amp; 弱联网手游 防破解、金币改动 简单措施

    手游经常使用破解方法 对于一个弱联网或者单机游戏,能够从下面方面去破解: 1.找得到存档文件的,直接破解改动存档文件. 2.找不到存档文件,就在游戏执行时借助一些软件来改动数值,比方用各种改动器手游助 ...

  5. 安卓系统底层C语言算法之測试參数是几个long型的算法

    #include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...

  6. ym—— Android网络框架Volley(终极篇)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持! 没看使用过Volley的同学能够,先看看Android网络框架Volley(体验篇)和 ...

  7. MySQL List分区(三)

    具体介绍请看   MySQL分区一 样例:该样例为本人个人学习总结分享

  8. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  9. Sublime 是自动检测而非自动设置缩进

    以为是自动设置规范化的缩进 以前一直认为是:识别出文件类型后,设置统一的缩进规范.比如说 识别为CSS,就把缩进设成2个空格 其实是自动检测然后与你保持统一 亲测发现,根据你文本里用的是几个空格的缩进 ...

  10. Python多线程原理与实现

    Date: 2019-06-04 Author: Sun Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了解线程池的使用 1 线程基本 ...