SpringMVC+Spring3+hibernate4 开发环境搭建以及一个开发实例教程
刚刚接触了SpringMVC这个框架,因此有必要把它拿过来同hibernate、Spring框架进行集成和开发一个实例,在真正企业从头开发的项目中往往一个稳定的开发环境至关重要,开发一个项目选择什么样的搭建平台也须要有经验才干够,并非说你会搭建一个开发平台然后公司就会用你搭建的开发平台。一个项目或者一个公司看中的也不是你能够搭出框架。而是在这个框架使用过程中出现的各种问题你能够解决掉。
也就是说呢,不管开发什么项目要做到稳定、环境稳定、开发成本稳定、技术稳定、换句话说就是“风险可控”,你不能说一个新的项眼下期开发到一半的时候发现这个开发环境不合适或者出现了啥新的问题你还解决不了,这不是非常淡腾的事吗?
对我们而言须要不只能够搭建一个平台并且要掌握它。掌握它能够出现的各种问题或bug。假设你没有掌握到这样的程度能够出你不过走马观花似得搭建了一个鸡窝,没有什么有用价值的,个人认为老板或者面试者也是更注重后者。所以呢,这篇博客也是注重说在搭建过程中遇到的各种问题,这也印证了打江山easy但想要坐稳了不易。
本文思路
首先,看一下已经建好的整个项目文件夹结构,採用了经典三层在Eclipse里面:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlsb25nc2hlbmcxMTI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
结构非常清晰採用了springmvc注解扫描包。里面大部分内容都是通过注解实现的可见通过注解来实现某某个功能也是一种趋势呀。注解操作简单、写的少却能实现相同的功能也是因为这个原因受到人们的欢迎。
SpringMVC与Spring集成
它同spring集成要做的事情是把bean交给spring管理,springmvc自己则不再管理bean它通过注解的方式取得spring实例化好的bean类,想让spring管理其bean就须要实例化Spring自己的WebApplicationContext对象。这个对象是上下对象程序执行全部的參数以及设置都能够从这个对象中取得bean也不列外。我们能够在web.xml文件里设置一个监听器在程序启动的时候得到WebApplicationContext对象。这个对象有它自己的属性。属性就是我们bean的配置文件。所以它才干够正确找到bean并将事实上例化。我们看一下配置文件。再看一下监听器类的源代码就能够知道原理。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springAnnotation-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
上面配置是web.xml里配置的bean路径參数以及spring的监听器类,再看一看监听器类的源代码
package org.springframework.web.context; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class ContextLoaderListener extends ContextLoader
implements ServletContextListener
{
private ContextLoader contextLoader; public ContextLoaderListener()
{
} public ContextLoaderListener(WebApplicationContext context)
{
super(context);
}
}
………………………………………………………………………略…………………………………………………………………………………
这个类是监听类的部分代码,可看到它继承了ContextLoader这个类并将这个类作为成员变量传入进来,进去看一下contextloader这个类。
package org.springframework.web.context;
………………………………………………………………………略…………………………………………………………………………………
import …………
import org.springframework.util.StringUtils; public class ContextLoader
{
public static final String CONTEXT_CLASS_PARAM = "contextClass";
public static final String CONTEXT_ID_PARAM = "contextId";
public static final String CONTEXT_INITIALIZER_CLASSES_PARAM = "contextInitializerClasses";
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
public static final String LOCATOR_FACTORY_SELECTOR_PARAM = "locatorFactorySelector";
public static final String LOCATOR_FACTORY_KEY_PARAM = "parentContextKey";
private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";
private static final Properties defaultStrategies;
private static final Map<ClassLoader, WebApplicationContext> currentContextPerThread;
private static volatile WebApplicationContext currentContext;
private WebApplicationContext context;
private BeanFactoryReference parentContextRef; public ContextLoader()
{
}
……………………………………………………略…………………………………………………………
能够看到父类中有这个变量
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
正好是我们配置文件里配置的以下的值,把bean的配置文件值通过contextConfiglocation传入了spring监听器。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springAnnotation-*.xml</param-value>
</context-param>
这就是spring与springmvc集成的原理,看了代码相信大家已经非常清楚,能够用一句话概括;将bean交给spring管理。
仅仅有懂了原理在出现错误的时候才方便调试。以后再出现监听器错误,比如空指针了、创建失败了。不用想你就知道可能传入的配置文件没有传入你懂了原理之后也能够自己改它的源代码,传入很多其它參数等,事实上,不管是spring还是springmvc他们的监听器都是集成context这个父类而来,再往大了想想web层框架大部分都是集成该类,以后你在学习web框架的时候就会认为非常easy,你找到了他们的共同点一个网的节点你找到了剩下的就是学习他们的不同点了每一个框架都有自己的特色。我理解的也不是非常全面在你不理解时候多思考(它的设计思路)、多动手(看代码源代码)会逐步理解、逐步深入。
Spring与hibernate4集成
发现如今非常多公司也在使用ibatis、mabatis等框架,我们就一起对照着说说他们都是怎么集成,事实上都是一样的有着异曲同工的感觉思路和实现方式是一样的。
设计思路。
1.配置数据源
2.配置sessionFactory或者sqlMapclient
3.配置Transaction事务
在同数据库底层集成的框架中大部分也都是这三部,不同之处在于实现类不一样、实现的功能一样但对象不一样,举个样例;我们都知道sessionFactory属于一个对象。但在ibatis里面不是这个对象名但有相同的功能叫做。SqlMapClient.
ibatis这个框架是基于配置文件实现sql语句都写在配置文件中面,通过sqlMapclient对象能够拿到配置信息,它有两个重要的属性即数据源和xml配置文件,其它的是一些辅助參数可有可无。
对于事务也不过管理事务的类不同,但机制一样我配置的这样的都是通过代理事务类实现。优点就不多说了。
1.先看看hibernate数据源配置例如以下。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/springmvc"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
我使用的是mysql数据库,也能够改查oracle数据库,dataSource同ibatis非常相似属性也一样。须要注意的是在数据源中往往会增加连接池配置,这个也是在这里进行配置。
2.sessionFactory
以下是hibernate、sessionFactory配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hbiernate.format._sql">true</prop>
</props>
</property>
<property name="configLocations">
<list>
<value>classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml</value>
</list>
</property>
</bean>
对照ibatis 配置
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sql-map-config.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="lobHandler" ref="lobHandler"/>
</bean>
能够发现不过属性值不一样,属性都是一样的说明他们的实现方式都是一样的但实现类不一样。当中有个lobHandler属性是为了处理超大数据设置的属性。比方一个文件1G存储在数据库字段中就须要用到这个配置,进行特殊处理操作。
一个sessionFactory能够相应于多个数据源即能够对用于多个数据库,这里仅仅是配置了一个数据库,多个数据库又会涉及到分布式事务概念又会略微复杂一点,以后再介绍怎么配置,它管理着数据库中的表结构和各种表实现对表的操作。
3.事务管理
hibernate配置事务
<bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true" >
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED</prop>
</props>
</property> </bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
该事务使用了代理方式。为某个类配置事务时须要集成该事物类,例如以下
<bean id="userManagerBase" class="com.tgb.web.controller.service.UserManager">
<property name="userDao" ref="userDao"></property>
</bean> <bean id="userManager" parent="transactionBase">
<property name="target" ref="userManagerBase"></property>
</bean>
用户管理添加用户
UserAction.java 下面为对用的各层类和方法能够实现简单调用,接口里面还能够增加泛型在下篇博客中会设计接口里面怎么使用泛型操作。
@Controller
@RequestMapping("/user")
public class UserController { @Resource(name="userManager")
private IUserManager service; @RequestMapping("/addUser")
public void addUser()
{ User user=new User();
user.setId("1");
user.setAge("2");
user.setUsername("3"); service.addUser(user); }
}
IUserDao interface
public interface IUserDao { void addUser(User user);
}
userDaoImpl
private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} @Override
public void addUser(User user) { sessionFactory.getCurrentSession().save(user);
}
IUserManager interface
public interface IUserManager { void addUser(User user);
}
userDaoImpl
public class UserManager implements IUserManager { private IUserDao userDao; public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
} @Override
public void addUser(User user) {
userDao.addUser(user);
} }
代码简单相信不用凝视也能够看懂。通过看上面的内容你也会搭建这个搭建并实现简单的实例了,假设你没有电脑能够通过手机看这篇文章。用你的手机扫描以下的二维码既能够关注,然后,回复“技术SSH”这篇文章就会自己主动发到你的手机上。
微信号为:life_talk
SpringMVC+Spring3+hibernate4 开发环境搭建以及一个开发实例教程的更多相关文章
- ArcGIS API for JavaScript开发环境搭建及第一个实例demo
原文:ArcGIS API for JavaScript开发环境搭建及第一个实例demo ESRI公司截止到目前已经发布了最新的ArcGIS Server for JavaScript API v3. ...
- vue前端+java后端 vue + vuex + koa2开发环境搭建及示例开发
vue + vuex + koa2开发环境搭建及示例开发 https://segmentfault.com/a/1190000012918518 vue前端+java后端 https://blog.c ...
- android开发环境搭建(for 驱动开发人员)
前言 一.android驱动的开发流程 1: 写LINUX驱动 2: 写LINUX应用测试程序 3: 写JNI接口,用来包装第二步写的应用 (要用NDK来编译) 生成一个.SO文件,相当于CE下的DL ...
- JFinal开发环境搭建,JFinal开发案例
JFinal 是基于 Java 语言的极速 WEB + ORM 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所 ...
- Titanium开发环境搭建第一个坑
操作系统: Ubuntu 12.04 LTS AMD64 在Titanium Studio中,装Titanium CLI怎么都不能成功,到了一个进度,发现卡在那里,硬盘一直狂闪,发现在Studio的文 ...
- FFmpeg 开发环境搭建及第一个程序 Hello FFmpeg 编写
1. FFmpeg 的安装 ./configure make make install 默认会将 FFmpeg 安装至 /usr/local 目录下(可通过 configure 使用 "-p ...
- Linux下Java开发环境搭建—CentOS下Mysql安装教程
本人学习Linux时使用的是CentOs5.5版本,在该环境中,Mysql的安装方法有很多种,下面我只讲我这次成功了的方法,作为一个记录,供大家参考,同时给自己做一个笔记. MySQL下载 1.进入网 ...
- Windows下Node.js开发环境搭建-合适的开发环境
1)生产环境中的Node.js应用 Windows + Linus 2)虚拟机工具 VirtualBox 虚拟机CentOS安装 3)xShell与xFtp(windows到linux文件传输) 4) ...
- Java开发环境搭建——IntelliJ Idea开发环境
IntelliJ Idea版本选择由于公司使用JDK7,所以我选择安装Version 2016.1.4(手动安装试验出来的,最新版的2016.1.4启动时提示需要安装JDK8)下载 前面说明有误,其实 ...
随机推荐
- poj 2635 The Embarrassed Cryptographer(数论)
题目:http://poj.org/problem?id=2635 高精度求模 同余模定理. 题意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L 问这两个大素数中最小的一个是 ...
- [原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
- bzoj1385: [Baltic2000]Division expression
欧几里得算法.可以发现规律,a[2]作为分母,其他作为分子,必定是最好的选择.判断是否为整数即可. #include<cstdio> #include<cstring> #in ...
- 【兼容】IE下PNG色差
IE(包括IE7)中的PNG色差问题http://bbs.blueidea.com/thread-2910513-1-1.html修正IE对PNG颜色显示错误的问题http://www.lizhenw ...
- 陈正冲老师对于c语言野指针的解释
那到底什么是野指针呢?怎么去理解这个“野”呢?我们先看别的两个关于“野”的词: 野孩子:没人要,没人管的孩子:行为动作不守规矩,调皮捣蛋的孩子.野狗:没有主人的狗,没有链子锁着的狗,喜欢四处咬人. 对 ...
- (一)学习CSS之z-index属性
参考:http://www.w3school.com.cn/cssref/pr_pos_z-index.asp z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元 ...
- 说下 winOS / IOS / android /Linux 视频、音频 编码解码问题
最近有朋友遇到一个问题, ios 上传视频文件,想在本地压缩下,然后再上传到服务器. 问有没有什么 视频处理的库, 最近Khronos的webgl 支持HTML5 ,(原理 WebGL 是openGL ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.5
Show that the inner product $$\bex \sef{x_1\vee \cdots \vee x_k,y_1\vee \cdots\vee y_k} \eex$$ is eq ...
- spring的三种注入方式
接口注入(不推荐) 构造器注入(死的应用) getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA ...
- H5制作1--母亲节快乐
H5作品现在很流行额. 早上起的很早.就自己试着去了解了一下.感觉很easy. 用了百度的H5在线制作工具.感觉很easy.顺便给百度做下推广吧.h5.baidu.com 于是就有了自己的第一个dem ...