3、 在WEB-INF/下配置web.xml,applicationContext.xml(配置BeanFactory,和springmvc集成),spring-servlet.xml(注解方式:需要配置启动注解,扫描的包,请求分派器,视图解析器,异常处理器,拦截器,国际化等等)
4、 在src下配置hiberante.cfg.xml:指定使用数据库的信息,基本的属性是否显示sql语句,使用方言,自动创建表等等,还有配置映射文件
5、 建立项目的包结构已经相关联(视图层,模型层,控制层)
集成环境:
Spring3.0,Hibernate3.X
在web.xml中配置表示层SpringMVC-----DispatcherServlet。
配置webFactory:spring-servlet.xml
将annotation.jar放下项目下才能使用注解集成:该包位于tomcat/lib(还有许多不知名的包需要用的)
模型层:(hibernate)
直接对数据库进行存储和加载
持久层由hibernate完成
使用<mapping resources=””>标签将hbm.xml文件配置到hibernate.cfg.xml主配置文件中
applicationContext.xml中的配置:
1、 Spring替Hibernate生成sessionFactory工厂
作用:生成全局性事务,创建HibernateTemplate对象
2、创建事务管理器
作用:按照事务的传播特性决定某一个方法如何使用事务
3、事务传播特性
作用:决定相应的方法如何使用事务
4、配置AOP(声明式事务)
作用:指定事务边界(一般为业务层)
AOP:面向切面编程,需要增加新的功能的时候不改变源代码直接增加。
AOP主要技术:是为实现接口的类做动态代理
动态代理:JDK动态代理需要生成代理对象,需要实现InvocationHandler接口,通过newProxyInstance()
目标对象和代理对象:实现了同一个接口
调用代理对象的方法,会调用this所指的invoke方法,织入事物。
全局性事务:
sessionFactory生成的是全局性事务,归所有的方法公有。
使用全局性事务的特点:使得访问数据库由并行变串行,安全性好
数据库只能处理串行的数据,不能接受并行访问
在spring的配置文件中直接注入hibernateTemplate对象,通过注入sessionFactory<bean id=” hibernateTemplate”class=”…”>
在业务层直接hibernateTemplate使用:
@Resource(name=”hibernateTemplate”)
private HibernateTemplate hibernateTemplate;
如果注入的对象中的方法不符合pointcut方法,就不会创建代理对象,不织入advice,拿到的对象是目标对象。
Tomcat启动:
读取web.xml文件,创建监听器对象,创建application内置对象,把全局初始化参数设到application中。
监听器调用contextInitialized()方法中application中拿到spring的主配置信息创建BeanFactory,存到application内置对象中
一创建BeanFactory做以下这些事情:
1、 先通过读取hibernate的主配置文件hiberante.cfg.xml文件,创建了SessionFactory
Configuration cfg=new Configuration().configure();
2、 Spring替Hibernate管理事务,创建sessionFactory的工厂的作用?
l 根据sessionFactory创建hiberanteTemplate对象(session),使用的时候可以直接注入。
l 通过sessionFactory生成事务管理器,生成全局性事务,让hibernate的每一个session可以共享事务
3、 Spring为什么要用HibernateTemplate?
Spring轻量级的封装,使得hibernateTemplate线程安全
Callback技术,把公共的东西都提取出来。
创建DispatcherServlet对象
执行init()方法,读取配置文件
创建WebFactory对象。
创建视图定位器
作用:给view加上前缀和后缀,找到指定页面
创建请求分派器:
请求分派器去找请求对应的后端处理器类,马上创建后端处理器对象(初始化的时候创建)
一创建后端处理器对象就会注入业务层对象:
@Resource(name=”loginService”)
private LoginService loginService;
到beanFactory中找到id为注解中name标识的属性
发送请求:
1、请求交给tomcat.Tomcat创建request内置对象接收请求信息
2、发现是.do请求,就交给springmvc。
3、Springmvc截取请求,将请求交给请求分派器
4、请求分派器根据请求找到对象的后端处理器对应的方法
5、收集表单数据(创建user对象,自动将表单中的数据收集到属性中,将user对象以属性名user的形式设到request中)
6、调用业务对象的方法(业务对象为代理对象)
7、调用代理对象的invoke()方法,织入advice
8、返回ModelAndView对象,找到视图定位器,转到对应的页面。
运行时异常:出错也回滚
编译异常:出错但是不回滚
事务边界设到业务层:因为持久层的底层数据库可能不一样
创建持久层对象,在持久层类通过注解中注入hiberanteTemplate
创建业务层对象,在业务层对象类中通过注解注入持久层对象
为什么事务的边界需要设到业务层?
出现这个问题的原因:DAO层没有事务hibernate是无法对数据库进行操作的,所以最需要事务的是DAO层