仿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 {
}

源代码已上传下载链接

欢迎各位大神指点

时间: 2024-08-28 22:19:46

仿hibernate,spring框架手动写的相关文章

Struts2+Hibernate+Spring框架实现增删改查

一.添加3个框架的JAR包,完成后写配置文件: 1.web配置文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation=&quo

spring,hibernate,spring框架整合

SSH框架作为javaEE最经典的框架, 初学者整合这几个框架可能也是一件比较头痛的事情(包括我自己), 下面来进行框架的整合!   一:   准备   SSH框架介绍 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet, 处于MVC的控制层,Struts 2是Struts的下一代产品,个人认为: struts2~~struts+xwork; Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表

Struts2&amp;Hibernate&amp;Spring框架目录

  第3章 Struts2框架 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架 使用目的:减少在运用MVC设计模型来开发Web应用的时间 3.1 Struts2框架概述 3.1.1 Struts2框架的由来 Struts2是在Struts1和WebWork的基础上进行了合并,是一种全新的MVC框架. 3.1.2 框架的体系结构图 3.2 Struts2框架的基本用法 3.2.1 使用Struts2框架的开发步骤 3.2.2 Struts2框架的Action接口 3.2.3 St

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

上文中我们介绍<工作笔记2.软件开发常用工具> 从今天开始本文将教大家如何进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个独立配置:struts2. Hibernate. Spring 2)2个整合:整合Sring和struts2. 整合Spring和Hibernate 3)资源分类 开发包.软件.框架源码,已经共享到百度网盘:http://pan.baidu.com/s/1o6FkbA6 一.3个独立配置 1.Struts2: 1

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

这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一下分工吧: Struts2做的MVC的流程框架,主要完成从客户端访问到选择action的过程,其中过滤器起到了Controller的作用,action属于model,而jsp则是view页面的展示. Spring主要利用Ioc的特长来管理各种对象:action,service,dao,数据访问源,H

使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)

前言 SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层(实体层). Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持.Spring一方面作为一个轻量级的IoC容器,负责查找.定位.创建和管理对象及

SSH(struts2+spring+hibernate)三大框架整合

SSH框架整合理论: 在SSH框架的JAVAweb项目的开发过程中,WEB层通常使用的是Struts2+jsp,service层使用的是javaBean,DAO层使用的是hibernate,而spring的使用覆盖三层. 使用了spring框架之后,我们可以把对象交给spring来管理.在WEB层中,所有action对象的创建和管理都可以交给spring来完成,这样Struts2就不用自己来new一个action,这一切都可以交给spring,直接向spring来要action对象. 在DAO层

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

转:http://www.cnblogs.com/System-out-println/p/5974113.html Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架.它基于当年的WebWork和XWork框架,继承其优点,同时做了相当的改进. 1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程. 2.使用OGNL进行参数传递.OGNL提供了在Struts2里

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

| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SSH框架简介:①SSH框架是由struts2.spring.hibernate三大框架组合起来的一套总框架,一般来说这三个东西我们不会单独使用.  ②在学习SSH框架之前建议读者先学mvc,因为SSH是在mvc基础上根据mvc的缺点而产生的一套比较成熟的框架,也比较稳定.  ③SSH框架的流程:浏览器