【spring的使用方法】
文章目录
- 一、Spring框架
- (一)Spring官网
- (二)Spring框架简介
- (三)为什么要选择Spring?
- 优点:
- 好处:
- 二、创建Spring应用程序 - 骑士完成任务
- (一)创建Maven项目
- (二)修改项目的`Maven`配置
- (三)添加Spring依赖
- (三)创建杀龙任务类
- (四)创建勇敢骑士类
- (五)采用传统方式让勇敢骑士完成杀龙任务
- (六)采用Spring框架让勇敢骑士完成杀龙任务
- 1、创建日志属性文件
- 2、创建Spring配置文件
- 3、在Spring配置文件里创建Bean
- (1)创建杀龙任务Bean
- (2)创建勇敢骑士Bean
- 4、创建新勇敢骑士测试类
- 5、创建两个勇敢骑士Bean
- 6、修改新勇敢骑士测试类
- (七)采用构造方法注入方式注入属性值
- 1、创建救美任务类
- 2、创建救美骑士类
- 3、配置救美骑士Bean
- 4、创建旧救美骑士测试类
- 5、创建新救美骑士测试类
一、Spring框架
(一)Spring官网
网址:https://spring.io
Spring Framework - https://spring.io/projects/spring-framework
- 目前(2022-6-6)Spring Framework版本是5.3.20
(二)Spring框架简介
Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发。我得出一个公式:Spring = 春天 = Java程序员的春天 = 简化开发。最后的简化开发正是Spring框架带来的最大好处。
Spring是一个开放源代码的设计层面框架,它是于2003 年兴起的一个轻量级的Java 开发框架。由Rod Johnson创建,其前身为Interface21框架,后改为了Spring并且正式发布。Spring是为了解决企业应用开发的复杂性而创建的。它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。Spring 的理念:不去重新发明轮子。其核心是控制反转(IOC)和面向切面(AOP)。
(三)为什么要选择Spring?
优点:
- 方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 - AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。 - 声明事物的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。 - 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。 - 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。 - 降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。 - Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
好处:
在我们进入细节以前,我们可以看一下Spring可以给一个工程带来的一些好处:
- Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
- Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
- Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
- Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
使用Spring构建的应用程序易于单元测试。 - Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
- Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
- Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
- Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
- 低侵入式设计,代码污染极低
- 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
- Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
- Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
- Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
- Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
二、创建Spring应用程序 - 骑士完成任务
(一)创建Maven项目
这里博主使用的IDEA2022版本搭建的该工程,
创建Maven项目 -
SpringDemo
,设置项目位置以及组ID
单击【create】按钮,然后生成该项目
(二)修改项目的Maven
配置
- 先打开
File
->Settings
,进入IDEA的设置界面
- 按照图片指示依次点击,配置
Maven
(三)添加Spring依赖
在Maven仓库里查找Spring框架(https://mvnrepository.com)
查看
Spring Core
选择最新版本 -
5.3.20
添加到
pom.xml
文件的<dependencies>
元素里
同理添加其他依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.Lee.spring</groupId><artifactId>SprintDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--Spring核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version></dependency><!--Spring实体--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.3.20</version></dependency><!--Spring容器--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><!--Spring Web--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.20</version></dependency><!--Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><!--Spring测试--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.20</version></dependency><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies>
</project>
但是大家可以看到Maven呈现一个红色波浪线的,说明这些依赖包还没有下载到本地仓库
或者如下面这种情况
打开Maven窗口,单击刷新按钮,就会开始自动下载依赖包
下载好依赖包以后Maven仓库就不会在呈现红色波浪线
等待插件与依赖下载完成(第一次下载有点慢,需要耐心等待)
查看本地Maven仓库
可以查看项目下载的有关Spring框架的依赖
(三)创建杀龙任务类
- 创建
net.Lee.spring.lesson01
包,然后在包里面创建SlayDragonQuest
类 - 创建完
net.Lee.spring.lesson01
和SlayDragonQuest
的样子
package net.Lee.spring.lesson01;/*** 功能:杀龙* 作者:LEE* 日期:2020年05月27日*/public class SlayDragonQuest {public void embark() {System.out.println("执行杀龙任务......");}
}
(四)创建勇敢骑士类
在
net.huawei.spring.day01
包里创建BraveKnight
类
package net.Lee.spring.lesson01;/*** 功能:勇敢骑士类* 作者:LEE* 日期:2020年05月27日*/public class BraveKnight {// 勇敢骑士姓名private String name;// 创建杀龙任务对象private SlayDragonQuest slayDragonQuest;public void setName(String name) {this.name = name;}/*** 设置杀龙任务** @param slayDragonQuest*/public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest) {this.slayDragonQuest = slayDragonQuest;}/*** 勇敢骑士执行任务*/public void embarkOnQuest() {System.out.print("勇敢骑士[" + name + "]");slayDragonQuest.embark(); // 执行杀龙任务}
}
- 回顾一下传统方式怎么使用这两个类。需要我们自己通过
new
实例化两个类,然后设置勇敢骑士对象的姓名和杀龙任务属性,然后调用勇敢骑士执行任务的方法。
(五)采用传统方式让勇敢骑士完成杀龙任务
在
test/java
里创建net.Lee.spring.lesson01
包,然后在包里面创建TestBraveKnightOld
类
package net.Lee.spring.lesson01;import org.junit.Test;/*** 功能:采用传统方式测试勇敢骑士类* 作者:LEE* 日期:2022年05月27日*/
public class TestBraveKnightOld {@Testpublic void testBraveKnight() {// 创建杀龙任务对象SlayDragonQuest slayDragonQuest = new SlayDragonQuest();// 创建勇敢骑士对象BraveKnight braveKnight = new BraveKnight();// 设置勇敢骑士属性braveKnight.setName("罗宾汉");braveKnight.setSlayDragonQuest(slayDragonQuest);// 调用勇敢骑士执行任务方法braveKnight.embarkOnQuest();}
}
运行测试方法
testBraveKnight()
查看程序运行结果
(六)采用Spring框架让勇敢骑士完成杀龙任务
1、创建日志属性文件
在
resources
目录里创建log4j.properties
- 创建好后的样子
log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
2、创建Spring配置文件
在
resources
里创建xmlconfig
目录,然后在里面创建spring-config.xml
输入Spring配置文件名后,产生文件
单击【Configure application context】(配置应用上下文)
单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的
单击【OK】按钮
现在我们有了生产Bean的车间,下面我们就要在车间里配置产品
3、在Spring配置文件里创建Bean
(1)创建杀龙任务Bean
<!--杀龙任务Bean--><bean id="slayDragonQuest" class="net.Lee.spring.lesson01.SlayDragonQuest"/>
- id属性 :对应对象名,可以任取,然后在应用程序里我们可以通过这个
id
值从Spring
容器中获取Bean
对象。 - class属性 :表明Bean对象是基于哪个类来实例化,注意一定要包含包名。
(2)创建勇敢骑士Bean
<!--创建勇敢骑士Bean--><bean id="RobinHood" class="net.Lee.spring.lesson01.BraveKnight"><property name="name" value="罗宾汉"/> <!-- RobinHood.setName("罗宾汉")--><property name="slayDragonQuest" ref="slayDragonQuest"/> <!--RobinHood.setSlayDragonQuest(slayDragonQuest)--></bean>
- property元素:给对象设置属性值
- name属性:Bean对象的属性名
- ref属性:Bean对象的属性值(
引用
另一个Bean对象) - 勇敢骑士Bean通过
<property>
元素将杀龙任务Bean注入作为其属性。注意,name
属性值一定是BraveKnight
类的属性名,ref
属性值是已定义的杀龙任务Bean的id
值。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--杀龙任务Bean--><bean id="slayDragonQuest" class="net.Lee.spring.lesson01.SlayDragonQuest"/><!--创建勇敢骑士Bean--><bean id="RobinHood" class="net.Lee.spring.lesson01.BraveKnight"><property name="name" value="罗宾汉"/> <!-- RobinHood.setName("罗宾汉")--><property name="slayDragonQuest" ref="slayDragonQuest"/> <!--RobinHood.setSlayDragonQuest(slayDragonQuest)--></bean></beans>
通过Spring配置文件,创建了两个Bean对象,它们之间存在依赖关系,第一个Bean对象是第二个Bean对象的任务属性值。
4、创建新勇敢骑士测试类
在
test/java/net.Lee.spring.lesson01
里创建TestBraveKnightNew
测试类
package net.Lee.spring.lesson01;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 功能:测试勇敢骑士类* 作者:LEE* 日期:2022年05月29日*/
public class TestBraveKnightNew {private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器@Before // 每次测试方法执行前都要执行的代码public void init() {// 基于Spring配置文件创建应用容器context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");// 提示用户System.out.println("Spring应用容器已创建~");}@Testpublic void testBraveKnight() {// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是"RobinHood")BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");// 勇敢骑士执行任务braveKnight.embarkOnQuest();}@After // 每次测试方法执行后都要执行的代码public void destroy() {// 关闭应用容器context.close();// 提示用户System.out.println("Spring应用容器已关闭~");}
}
- 代码说明:首先通过Spring配置文件创建Spring应用容器,然后就可以利用容器的
getBean
方法通过名称获取容器里的Bean对象,然后调用该对象的方法。 - 运行测试方法testBraveKnight(),查看结果
5、创建两个勇敢骑士Bean
- 基于一个类可以创建多个对象,因此,在
spring-config.xml
文件里,也可以基于同一个类创建多个Bean。 - 基于
BraveKnight
类再创建两个Bean
,id
值分别为Gareth
和Galahad
。
<!--创建勇敢骑士Bean--><bean id="Gareth" class="net.Lee.spring.lesson01.BraveKnight"><property name="name" value="加雷斯"/> <!-- Gareth.setName("加雷斯")--><property name="slayDragonQuest" ref="slayDragonQuest"/> <!--Gareth.setSlayDragonQuest(slayDragonQuest)--></bean><!--创建勇敢骑士Bean--><bean id="Galahad" class="net.Lee.spring.lesson01.BraveKnight"><property name="name" value="加拉哈德"/> <!-- Galahad.setName("加拉哈德")--><property name="slayDragonQuest" ref="slayDragonQuest"/> <!--Galahad.setSlayDragonQuest(slayDragonQuest)--></bean>
- 在Spring配置文件里,同一个Bean不能重复定义,也就是说不允许两个Bean有相同的
id
值
6、修改新勇敢骑士测试类
- 获取新建的两个勇敢骑士Bean,调用执行任务方法
package net.Lee.spring.lesson01;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 功能: 测试勇敢骑士类* 作者: LEE* 日期: 2022年5月27日*/public class TestBraveKnightNew {private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器@Before // 每次测试方法执行前都要执行的代码public void init() {// 基于Spring配置文件创建应用容器context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");// 提示用户System.out.println("Spring应用容器已创建。");}@Testpublic void testBraveKnight() {// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“RobinHood”)BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");// 勇敢骑士执行任务braveKnight.embarkOnQuest();// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)BraveKnight Gareth = (BraveKnight) context.getBean("Gareth");// 勇敢骑士执行任务Gareth.embarkOnQuest();// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)BraveKnight Galahad = (BraveKnight) context.getBean("Galahad");// 勇敢骑士执行任务Galahad.embarkOnQuest();}@After //每次测试方法执行后都要执行的代码public void destroy() {// 关闭应用容器context.close();//提示用户System.out.println("Spring容器已关闭");}}
执行
testBraveKnight()
测试方法,查看结果
勇敢骑士Bean采用
属性注入
方式将杀龙任务Bean注入作为其属性。初始化对象其实可以调用有参构造方法来设置属性的初始值,对应到Spring的Bean工厂,就还有一种注入方式,叫做
构造方法注入
。同样地,我们还是通过案例来演示如何通过构造方法来注入属性值。
(七)采用构造方法注入方式注入属性值
1、创建救美任务类
在
net.Lee.spring.lesson01
包里创建RescueDamselQuest
类Rescue Damsel - 拯救少女
package net.Lee.spring.lesson01;/*** 功能:救美任务类* 作者:Lee* 日期:2022年05月29日*/
public class RescueDamselQuest {public void embark() {System.out.println("执行救美任务……");}
}
2、创建救美骑士类
在
net.Lee.spring.lesson01
包里创建RescueDamselKnight
类
package net.Lee.spring.lesson01;/*** 功能:救美骑士类* 作者:LEE* 日期:2022年05月27日*/
public class RescueDamselKnight {private String name;private RescueDamselQuest rescueDamselQuest;/*** 有参构造方法** @param name* @param rescueDamselQuest*/public RescueDamselKnight(String name, RescueDamselQuest rescueDamselQuest) {this.name = name;this.rescueDamselQuest = rescueDamselQuest;}public void embarkOnQuest() {System.out.print("救美骑士[" + name + ']');rescueDamselQuest.embark();}
}
- 代码说明:通过构造方法来设置骑士的姓名与要执行的任务。
3、配置救美骑士Bean
在Spring配置文件里创建救美骑士Bean
arg: argument 参数
<!--救美任务--><bean id="rescueDamselQuest" class="net.Lee.spring.lesson01.RescueDamselQuest"/><!--创建救美骑士Bean --><bean id="Galahad" class="net.Lee.spring.lesson01.RescueDamselKnight"><constructor-arg value="格拉海德"/><constructor-arg ref="rescueDamselQuest"/></bean>
4、创建旧救美骑士测试类
- 在
test/java/net.Lee.spring.lesson01
包里创建TestRescueDamselKnightOld
类
package net.Lee.spring.lesson01;import org.junit.Test;/*** 功能:传统方式测试救美骑士类* 作者:LEE* 日期:2022年05月27日*/
public class TestRescueDamselKnightOld {@Testpublic void testRescueDamselKnight() {// 创建救美任务对象RescueDamselQuest rescueDamselQuest = new RescueDamselQuest();// 创建救美骑士对象RescueDamselKnight rescueDamselKnight = new RescueDamselKnight("格拉海德", rescueDamselQuest);// 救美骑士执行任务rescueDamselKnight.embarkOnQuest();}
}
- 运行
testRescueDamselKnight()
测试方法,查看结果
5、创建新救美骑士测试类
- 在
test/java/net.Lee.spring.lesson01
包里创建TestRescueDamselKnightNew
类
package net.Lee.spring.lesson01;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 功能:采用Spring容器测试救美骑士类* 作者:LEE* 日期:2022年05月27日*/public class TestRescueDamselKnightNew {private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器@Before // 每次测试方法执行前都要执行的代码public void init() {// 基于Spring配置文件创建应用容器context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");// 提示用户System.out.println("Spring应用容器已创建~");}@Testpublic void testRescueDamselKnight() {// 根据名称从应用容器里获取救美骑士对象RescueDamselKnight rescueDamselKnight = (RescueDamselKnight) context.getBean("Galahad");// 救美骑士执行任务rescueDamselKnight.embarkOnQuest();}@After // 每次测试方法执行后都要执行的代码public void destroy() {// 关闭应用容器context.close();// 提示用户System.out.println("Spring应用容器已关闭~");}
}
- 运行
testRescueDamselKnight()
测试方法,查看效果
【spring的使用方法】相关推荐
- spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...
- idea创建包怎么让包分层_idea创建Spring项目的方法步骤(图文)
Spring介绍 Spring概述 Spring是一个开源框架,Spring是2003年兴起的轻量级java开发框架,由Rod Johnson 在其著作 Expert One-On-One J2EE ...
- Spring的refresh()方法调用过程
Spring的refresh()方法调用过程 refresh()是Spring中比较核心的方法,Spring所有的初始化都在这个方法中完成 具体代码如下 public void refresh() t ...
- springboot+mybatis 的org.mybatis.spring.MyBatisSystemException 解决方法
springboot+mybatis 的org.mybatis.spring.MyBatisSystemException 解决方法 参考文章: (1)springboot+mybatis 的org. ...
- Spring Data JPA方法定义规范
Spring Data Jpa方法定义的规则: findBy+属性+(关键字) (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find ...
- Spring中RedisTemplate方法中,redis相关操作笔记。[redis生成指定长度自增批次号,删除、设置过期时间等]
Spring中RedisTemplate方法中,redis相关操作笔记. redis获取自增批次号 // opsForValue()生成long UUID = redisTemplate.opsFor ...
- Spring事务开启方法 传播特性 隔离界别
1 Spring事务开启方法 1 在Spring配置文件中开启事务并配置事务的类 2 在需要的需要的方法上 或者类上标注@Transactional 2 @Transactional 属性 1 row ...
- Spring事务内方法调用自身事务
Spring事务内方法调用自身事务 增强的三种方式 ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是cal ...
- java retry_Spring重试支持Spring Retry的方法
本文介绍了Spring重试支持Spring Retry的方法,分享给大家,具体如下: 第一步.引入maven依赖 org.springframework.boot spring-boot-starte ...
- spring mvc 控制器方法传递一些经验对象的数组
由于该项目必须提交一个表单,其中多个对象,更好的方法是直接通过在控制器方法参数的数组. 因为Spring mvc框架在反射生成控制方法的參数对象的时候会调用这个类的getDeclaredConstru ...
最新文章
- 电脑计算器_手把手教你使用初级会计机考系统计算器!
- 登陆失败bdstoken_解决PanDownload登录提示账号登录失败,获取bdstoken失败问题
- lstm 输入数据维度_LSTM 股票市场预测入门
- iOS sha1加密算法
- CF938G Shortest Path Queries(线性基/线段树分治/异或)
- 2017. 网格游戏
- [剑指offer]面试题第[57-2]题[JAVA][和为s的连续正数序列][数学法][滑动窗口]
- 对于String类型的深刻理解
- java 在面板中加入标签_创建一个JTabbedPane面板,为每一个标签设置一个名称
- 20175320 2018-2019-2 《Java程序设计》第6周学习总结
- python教程视频-私藏已久的7个Python视频教程
- ubuntu安装 Samba实现局域网文件共享 win10访问
- 算法(一):智能小车速度控制(PID模糊控制)
- Web入门-namp的下载与使用
- 苏嘉杭高速公路收费站升级改造(苏州地区)配电室综合监控系统的设计与应用
- python语音识别库kaldi_Kaldi 使用 DFSMN 训练语音模型
- File Based Optimizations(FBO,FBO焕新存储技术)介绍
- linux中 在文件中写入一句话怎么写_Linux一句话命令
- 星期几—YYYY-MM-DD,表示一个日期,你知道是星期几吗?
- 测试方案/测试计划/测试报告,经常弄混要怎么区分?
热门文章
- SQL Server 2019 开启数据库远程访问
- C语言中scanf()函数的返回值
- android图片上传后台后旋转的关键原因:ExifInterface
- SQL---In-Exists-Any
- centos8安装mysql8_CentOS 8安装MySQL8.0.22图文教程
- Matlab画星座图
- $().each和$.each()
- Quectel EC20 R2.1 AT指令集(基础部分)
- 如何利用python解方程_如何用python解方程
- 互联网公司的主要角色以及其职责