简单的说一下,这里的所有bean对象实际上就是像我最先讲的注入是一个原理,这些bean都被放入了spring容器中,他们的相互关系可以从配置文件中看出来。
其中一个localSessionFactoryBean是管理hibernate的会话的,所有的会话都来由这里管理。其实这个配置可以更复杂的,比如hibernate.cfg.xml这种引用方式可以变成更多的property设置,因为
hibernate.cfg.xml中含有很多配置,有的人喜欢将hibernate的所有配置都写在applicationContext.xml中,但实际上是没必要的,因为常用的是在程序中或许hibernate的会话工厂就行了。
后面代码中也会给大家展示一下,另外代码中我也实现了hibernate会话工厂的单例模式。
另外一个值得注意的是我自定义了一个springContextUtil类,这个类实现了将Spring应用上下文环境ApplicationContext放入一个静态变量中,以便后期业务编写的时候用到ApplicationContext,
实现的原理是实现ApplicationContextAware接口,springContextUtil还定义了一个getBean函数,可以通过id名随时取到bean对象,这个也是后期很需要的。
可以看下springContextUtil的实现:
然后是hibernate单例模式的会话工厂实现:
在spring的applicationContext.xml中我们还可以看到我还实现了AOP,比如方法前的调用,方法后的调用,以及异常的时候调用。
这些切面实现在后期业务代码过程中,只需要简单的改下配置文件就可以做到aop编程,就很舒服了。
至于刚才提到的引用hibernate.cfg.xml,也和一般的hibernate配置是一样的。只不过这里经过spring配置后,所有的hibernate资源都交给了spring框架。
hibernate.cfg.xml由于图片太长,截不完所有的图片,截图了部分,如下:
可以看见我用c3p0来作为我的数据库连接池的实现的。
由于我们这个还是web程序,所以初始化spring的初始化工作需要交给web.xml。同时因为我还实现了springMvc框架,所以web程序的
所有请求转发给MVC的请求分发器的初始化工作也应该交给web.xml。还有比较重要的一点是,spring支持多个配置文件,所以个人喜欢将
mvc的有关配置单独放在一个文件spring-action.xml中,这个spring-action.xml记录了具体的分发配置和mvc返回ModelAndView对象所对应页面的相对路径前缀
和文件后缀名,spring-action.xml如下:
web.xml文件如下:
另外由于已经成为了web程序,尤其是因为SimpleUrlHandlerMapping类和InternalResourceViewResolver跟web有关,所以,就不能够
在Java代码中初始化spring了,除非注释掉跟web有关的spring配置,所以应该通过tomcat服务器来做初始化spring的工作。
另外要记得将所有有关的class文件,jar包,jsp文件都放在webContent下,服务器才能正常运行不报错。
当然代码中也基本都是面向接口编程的,可以看我的文件目录看得出:
另外关于hibernate对象的映射我是通过注解的方式映射的,实际上还可以xml文件配置映射关系也可以。
映射可以从下图看出:
关于dao层同样是面向借口的编程,如图:
关于dao层的操作,只要继承刚才的单例会话工厂类就可以得到响应的会话,如图:
要注意的是session我并没有手动去关闭,因为getCurrentSessionOfHUtil中获取session的方式是
getCurrentSession(),这种方式是会自动关闭会话的,只要你的事务提交了或者回滚了都会帮你执行。
当你开启session后就可以按照你hibernate编程的方式来做了。这样就很好的将hibernate融入再spring框架中了。
另外mvc在spring都配置好了的情况下是很容易引进的,只要你的Controller类也放到spring容器中,以及Controller类继承好AbstractController类
就可以了。当然,前面的spring-action.xml加载和web.xml的初始化工作是少不了的。
mvc的某个方法如下:
当然框架的层级结构也是分层的,dao层查数据库,service层调用dao层,action层调用service。
目录结构可以看出这点:
最后我们来演示下框架是否搭建成功。
先启动tomcat,如图:
并没有报错。然后我们去浏览器客户端输入
:8080/springMvcOrm/anonymous.mvc?method=add&contentName=bokeyuan,如图:
在看看后台的打印信息:
可以看见既有aop拦截器,也执行了数据库操作。
最后我们看下数据库是否存下了某个数据,因为刚才的add方法是存一个数据:
可以看见数据也进入了数据库
同时也返回了一个页面。
至此,基于SpringMVC+Hibernate+MySQL的Web程序框架搭建完毕。
另外,像:8080/springMvcOrm/anonymous.mvc这种没有方法参数的请求,我也设定了一个默认的方法,也可以进入后台。
最后也返回了一个页面,效果如下图,当然最后这个页面是我在网上找的,一个单纯的css做了动态页面效果,很好看,