SpringMVC基础知识 (6)

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层

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwffj.html