springmvc不使用xml的transaction配置

springmvc不使用xml的transaction配置,第1张

在SpringMVC中,我们可以使用注解的方式配置事务,从而避免使用XML进行配置。具体步骤如下:

1 首先,在SpringMVC的配置类中加入@EnableTransactionManagement注解,开启事务支持。

2 在需要进行事务管理的方法上,使用@Transactional注解,标注该方法需要进行事务管理。同时,可以在注解中指定事务管理的属性,如事务传播属性、隔离级别、超时时间等等。

3 在SpringMVC的配置类中,需要配置一个事务管理器。可以使用Spring提供的DataSourceTransactionManager或者Hibernate的HibernateTransactionManager。在配置事务管理器时,需要指定数据源和事务管理属性。

4 如果需要在同一事务中进行多个数据库 *** 作,可以将多个 *** 作放在同一个方法中,并使用@Transactional注解进行标注。这样,在方法执行时,就会自动开启一个事务,并将多个 *** 作放在同一个事务中进行。

使用注解配置事务可以简化配置过程,减少代码量,提高开发效率。同时,也可以使代码更加清晰易懂,便于维护。不过,在使用注解配置事务时,需要注意事务的传播属性和隔离级别,避免出现事务管理的问题。

对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。 二、Spring Spring实际上是《Expert One-on-One J2EE Design and Development》一书中所阐述的设计思想的具体实现。在One-on-One一书中,Rod Johnson 倡导J2EE 实用主义的设计思想,并随书提供了一个初步的开发框架实现(interface21 开发包)。而Spring 正是这一思想的更全面和具体的体现。Rod Johnson在interface21 开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架。 Spring是一个开源框架,由Rod Johnson创建并且在他的著作《J2EE设计开发编程指南》里进行了描述。它是为了解决企业应用开发的复杂性而创建的。Spring使使用基本的JavaBeans来完成以前只可能由EJB完成的事情变得可能了。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量的控制反转和面向切面的容器框架。当然,这个描述有点过于简单。但它的确概括出了Spring是做什么的。为了更好地理解Spring,让我们分析一下这个描述: 1、轻量 从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于轻量,从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 2、控制反转 Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,对象被动地传递它们的依赖而不是自己创建或者查找依赖对象。你可以认为IoC与JNDI相反不是对象从容器中查找依赖,而是容器在对象初始化时不等被请求就将依赖传递给它。 3、面向切面 Spring包含对面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它们应该做的,完成业务逻辑,仅此而已。它们并不负责(甚至是意识)其它的系统关注点,例如日志或事物支持。 4、容器 Spring包含和管理应用对象的配置和生命周期,在这个意义上它是一种容器。你可以配置你的每个bean如何被创建基于一个配置原形为你的bean创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量的EJB容器,它们经常是庞大与笨重的,难以使用。 框架:Spring是由简单的组件配置和组合复杂的应用成为可能。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久性框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种子框架提供了基础。

<!--事务相关控制-->

<bean id="transactionManager" class="orgspringframeworkjdbcdatasourceDataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="add" propagation="REQUIRED" read-only="false" rollback-for="javalangException" />

<tx:method name="delete" propagation="REQUIRED" read-only="false" rollback-for="javalangException" />

<tx:method name="modify" propagation="REQUIRED" read-only="false" rollback-for="javalangException" />

<tx:method name="update" propagation="REQUIRED" read-only="false" rollback-for="javalangException" />

<tx:method name="find" read-only="true"/>

<tx:method name="get" read-only="true"/>

<tx:method name="select" read-only="true"/>

</tx:attributes>

</tx:advice>

<!--把事务控制在Service层-->

<aop:config>

<aop:pointcut id="pc" expression="execution(public comtestservice())" />

<aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />

</aop:config>

其实就是一个加载顺序的问题

首先使用了spring

MVC的项目是不需要配置action bean,而是通过spring

mvc的配置文件进行扫描注解加载的,spring事务配置文件还有上下文都是通过orgspringframeworkwebcontextContextLoaderListener加载的,而spring

MVC的action是通过orgspringframeworkwebservletDispatcherServlet加载的,这样就有个优先级的问题了,web是先启动ContextLoaderListener后启动DispatcherServlet,在ContextLoaderListener加载的时候action并没在容器中,所以现在使用AOP添加事务或者扫描注解都是无用的。

那么解决办法就是在DispatcherServlet加载的spring-MVC配置文件后再加上AOP事务扫描配置就OK了

1

2

3

4

5

6

7

8

<tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="questionReply" propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor advice-ref="defaultTxAdvice" pointcut="execution( comjeecmscmsactionfrontPhQuestionAct())"/>

</aop:config>

一、Spring常见问题

1、Spring 在ssm中起什么作用?

Spring:轻量级框架

作用:Bean工厂,用来管理Bean的生命周期和框架集成。

两大核心:

IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory

AOP:面向切面编程

2、Spring的事务?

编程式事务管理:编程方式管理事务,极大灵活性,难维护。

声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。

3、IOC 在项目中的作用?

作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。

4、Spring的配置文件中的内容?

开启事务注解驱动

事务管理器

开启注解功能,并配置扫描包

配置数据库

配置SQL会话工厂,别名,映射文件

不用编写Dao层的实现类

5、Spring下的注解?

注册

@Controller @Service @Component

注入

@Autowired @Resource

请求地址

@RequestMapping

返回具体数据类型而非跳转

@ResponseBody

6、Spring DI 的三种方式

构造器注入:通过构造方法初始化

<constructor-arg index="0" type="javalangString" value="宝马"></constructor-arg>

setter方法注入:通过setter方法初始化

<property name="id" value="1111"></property>

接口注入

7、Spring主要使用了什么模式?

工厂模式:每个Bean的创建通过方法

单例模式:默认的每个Bean的作用域都是单例

代理模式:关于Aop的实现通过代理模式

8、IOC,AOP的实现原理?

IOC:通过反射机制生成对象注入

AOP:动态代理

二、SpringMvc常见问题

1、SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?

问题:单例模式,在多线程访问时有线程安全问题

解决方法:不要用同步,在控制器里面不能写字段

2、SpringMvc 中控制器的注解?

@Controller:该注解表明该类扮演控制器的角色

3、@RequestMapping 注解用在类上的作用?

作用:用来映射一个URL到一个类或者一个特定的处理方法上

4、前台多个参数,这些参数都是一个对象,快速得到对象?

方法:直接在方法中声明这个对象,SpringMvc就自动把属性赋值到这个对象里面

5、SpringMvc中函数的返回值?

String,ModelAndView,List,Set 等

一般String,Ajax请求,返回一个List集合

6、SpringMvc中的转发和重定向

转发: return:"hello"

重定向 :return:"redirect:hellojsp"

7、SpringMvc和Ajax之间的相互调用?

通过JackSon框架把java里面对象直接转换成js可识别的json对象,具体步骤如下:

1、加入JackSonjar

2、在配置文件中配置json的映射

3、在接受Ajax方法里面直接返回Object,list等,方法前面需要加上注解@ResponseBody

8、SpringMvc的工作流程图

1、DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器

2、HandlerMapping处理器映射器,根据请求路径找到相应的HandlerAdapter处理器适配器(处理器适配器就是那些拦截器或Controller)

3、HandlerAdapter处理器适配器,处理一些功能请求,返回一个ModelAndView对象(包括模型数据、逻辑视图名)

4、ViewResolver视图解析器,先根据ModelAndView中设置的View解析具体视图

5、然后再将Model模型中的数据渲染到View上

9、Struts2 和 SpringMvc的区别

入口不同:

Struts2:filter过滤器

SpringMvc:一个Servlet即前端控制器

开发方式不同:

Struts2:基于类开发,传递参数通过类的属性,只能设置为多例

SpringMvc:基于方法开发(一个url对应一个方法),请求参数传递到方法形参,可以为单例也可以为多例(建议单例)

请求方式不同:

Struts2:值栈村塾请求和响应的数据,通过OGNL存取数据

SpringMvc:通过参数解析器将request请求内容解析,给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面,jsp视图解析器默认使用的是jstl。

三、Mybatis常见问题

1、Ibatis和Mybatis?

Ibatis:2010年,apache的Ibatis框架停止更新,并移交给了google团队,同时更名为MyBatis。从2010年后Ibatis在没更新过,彻底变成了一个孤儿框架。一个没人维护的框架注定被mybatis拍在沙滩上。

Mybatis:Ibatis的升级版本。

2、什么是Mybatis的接口绑定,有什么好处?

Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。

3、什么情况用注解,什么情况用xml绑定?

注解使用情况:Sql语句简单时

xml绑定使用情况:xml绑定 (@RequestMap用来绑定xml文件)

4、Mybatis在核心处理类叫什么

SqlSession

5、查询表名和返回实体Bean对象不一致,如何处理?

映射键值对即可

<result column="title" property="title" javaType="javalangString"/>

column:数据库中表的列名

property:实体Bean中的属性名

6、Mybatis的好处?

把Sql语句从Java中独立出来。

封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。

自己编写Sql语句,更加的灵活。

入参无需用对象封装(或者map封装),使用@Param注解

7、Mybatis配置一对多?

<collection property="topicComment" column="id" ofType="comtmfbbspojoComment" select="selectComment" />

property:属性名

column:共同列

ofType:集合中元素的类型

select:要连接的查询

8、Mybatis配置一对一?

<association property="topicType" select="selectType" column="topics_type_id" javaType="comtmfbbspojoType"/>

property:属性名

select:要连接的查询

column:共同列

javaType:集合中元素的类型

9 、${} 和 #{}的区别?

${}:预编译处理,把${}直接替换成变量的值,不做任何转换。

#{}:字符串替换,sql中的#{}替换成?,有效的防止Sql语句注入。

总结:一般用#{}来进行列的代替

10、获取上一次自动生成的主键值?

select last _insert_id()

11、Mybatis如何分页,分页原理?

RowBounds对象分页

在Sql内直接书写,带有物理分页

12、Mybatis工作原理?

原理:

通过SqlSessionFactoryBuilder从mybatis-configxml配置文件中构建出SqlSessionFactory。

SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。

完成数据库的CRUD *** 作和事务提交,关闭SqlSession。

你说的事务没有生效具体情况没看运行结果看不出来,我这里说一下我做的测试和理解吧。

首先我这个项目使用了SpringMVC搭建,事务配置和你的基本一致:

因为我的事务管理器使用的id是默认id,所以<tx:annotation-driven />后面不需要跟id

连接池使用的是commchangev2c3p0ComboPooledDataSource

然后我查资料了解到:

所以我就不像你这样写了,反正都是默认值

接着做出如下几种测试:

1、在Service实现层方法上添加@Transactional注解:

控制器的注册方法这么写:

可以看到这个是重复插表了,必然引起违反唯一约束异常

把数据库清空:

postman准备:

冲!

好,服务器返回500了,我们看下日志:

第一次insert时,首先创建了一个会话,注册事务,连接入池,执行插入,插入成功,释放会话资源,事务提交,事务关闭。

第二次insert,还是创建会话吧啦吧啦一堆,然后插入失败,服务器发生commysqljdbcexceptionsjdbc4MySQLIntegrityConstraintViolationException异常,此时直接释放会话,在服务器打印错误信息,事务关闭。事务没有进行提交,所以事务得到回滚。

但是可以发现因为第一次插入的会话也好,事务也好,已经和第一次插入不是一个了,所以第一次插入还是成功了:

只有第二次事务得到了回滚。

所以我意识到只有将所有数据库 *** 作都包含在同一个事务之中,那么事务回滚的时候才能大家一起回滚。

因此,这次测试的时候,我将@Transactional直接放到控制器中:

再冲!

再次500了,我们看下日志:

第一次插入时,新建了会话,注册了事务,入池,然后执行,执行成功,释放会话资源,然后事务没有关闭,也没有提交。

紧接着就开始第二次插入,它直接fetched(获取)当前事务中的会话,执行插入,释放会话资源,此时再次发生MySQLIntegrityConstraintViolationException异常,打印异常信息,事务没有提交直接关闭,得到回滚。

查了下数据库确实没有新数据被插入。

综上所述,我这个事务回滚还是生效了的,关键还是在于@Transactional注解的设置位置。这个注解设置在某个方法上,只能将这个方法内所进行的所有数据库 *** 作归结到一个事务里,出了这个方法,那就管不了了。

所以我想看一下你的这个注解到底是怎么加的?

另外直接把注解加载服务层的类上我试了也不行

这样也是无法回滚的。

以上就是关于springmvc不使用xml的transaction配置全部的内容,包括:springmvc不使用xml的transaction配置、springmvc +mybatis实现手动让事务回滚、springmvc+mybatis整合的事务管理的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9749147.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存