java框架:超详细Spring知识点汇总
ccwgpt 2024-10-11 11:14 57 浏览 0 评论
1spring框架概述
1.1什么是spring
lSpring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
l轻量级:与EJB(enterprise javabean ,企业级javabean)对比,依赖资源少,销毁的资源少。
l分层: 一站式,每一个层都提供的解决方案
web层:struts,spring-MVC
service层:spring
dao层:hibernate,mybatis , jdbcTemplate
1.2spring由来
lSpring 是java平台上的一个开源应用框架。它的第一个版本是由Rod Johnson写出来的。Rod在他的Expert One-On-One Java EE Design and Development(Java企业应用设计与开发的专家一对一)一书中首次发布了这个框架.
1.3spring核心
lSpring的核心是控制反转(IOC: inversion of control)和面向切面(AOP: aspect oriented program)
1.4spring优点
l方便解耦,简化开发(高内聚低耦合)
?Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
?spring工厂是用于生成bean
lAOP编程的支持
?Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
l声明式事务的支持
?只需要通过配置就可以完成对事务的管理,而无需手动编程
l方便程序的测试
?Spring对Junit4支持,可以通过注解方便的测试Spring程序
l方便集成各种优秀框架
?Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
l降低JavaEE API的使用难度
?Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
1.5spring体系结构
Spring框架整体被分为五个模块:核心容器(core container), 面向切面编程(aop), 数据访问(date access), web, test.
Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模块保持不变
Spring的jar包大约20个,每个都有相应的功能,一个jar还可能依赖了若干其他jar,所以搞清楚它们之间的关系,配置maven依赖就可以简洁明了.
1.5.1 core
core部分包含4个模块
spring-core:依赖注入IoC与DI的最基本实现
spring-beans:Bean工厂与bean的装配
spring-context:spring的context上下文即IoC容器
spring-expression:spring表达式语言
它们的完整依赖关系
因为spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4j,可以排除对commons-logging的依赖,没有日志实现而排除了commons-logging依赖,编译报错
1.5.2 aop
aop部分包含4个模块
spring-aop:面向切面编程
spring-aspects:集成AspectJ
spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器
spring-instrument-tomcat:针对tomcat的instrument实现(包含了spring的tomcat设备代理)
它们的完整依赖关系
1.5.3 data access
data access部分包含5个模块
spring-jdbc:jdbc的支持
spring-tx:事务控制
spring-orm:对象关系映射,集成orm框架
spring-oxm:对象xml映射
spring-jms:java消息服务
它们的完整依赖关系
1.5.4 web
web包含4个模块
spring-web:基础web功能,如文件上传
spring-webmvc:mvc实现
spring-webmvc-portlet:基于portlet的mvc实现
spring-websocket:为web应用提供的高效通信工具
它们的依赖关系
1.5.5 test
test部分只有一个模块,我将spring-context-support也放在这里
spring-test:spring测试,提供junit与mock测试功能
spring-context-support:spring额外支持包,比如邮件服务、视图解析等
它们的依赖关系
1.5.6 spring4新增
Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模块保持不变.
spring-websocket:为web应用提供的高效通信工具
spring-messaging:用于构建基于消息的应用程序
它们的依赖关系
2Demo1:xml方式配置IOC
2.1什么是IOC
Inversion of control(控制反转), 从字面上来理解: 当一个对象创建时, 它所依赖的对象由外部传递给他, 而非自己去创建所依赖的对象(比如通过new操作). 因此,也可以说在对象如何获取他所依赖的对象这件事情上, 控制权反转了.
2.2导入jar
l4+1(4个核心jar + commons-logging依赖)
如果使用maven管理,只需要配置context
lSpring的jar结构(字节码.文档.源码)
https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework
2.3搭建项目的基本结构
2.4创建配置文件
l文件名: 任意, 官方推荐使用 applicationContext.xml
l文件位置: 任意, 官方推荐放在classpath(src)下(这个叫做约定大于配置)
l配置文件内容: 引入schema约束,配置bean
基本的IOC功能只需要引入beans约束.
约束文件的位置:
spring-framework-4.1.6.RELEASE\docs\spring-framework-reference\html\xsd-config.html
<?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 id="userAction" class="com.cdsxt.action.UserAction"></bean> </beans> |
2.5测试
加载配置文件创建ApplicationContext上下文对象
从上下文中获取对象
public class TestIoc { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserAction us = (UserAction)context.getBean("userAction"); us.addUser(); } } |
2.6IOC的底层原理
lXml解析
l工厂设计模式
l单例模式
l反射
2.7Bean实例化的三种方式
2.7.1 使用类的无参构造函数创建对象(常用!重要!)
如果类中没有显示声明构造函数,系统会为该类提供一个默认的构造函数,开发者为一个类提供了构造函数,系统将不再为该类提供构造函数.
如果创建了有参的构造函数,没有显示声明无参空构造,会抛出异常
Caused by: java.lang.NoSuchMethodException: com.cdsxt.action.UserAction.<init>() at java.lang.Class.getConstructor0(Class.java:3082) at java.lang.Class.getDeclaredConstructor(Class.java:2178) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) ... 14 more |
2.7.2 使用静态工厂创建对象
l需要创建一个工厂类,并提供一个静态方法返回目标类的对象
lXml文件配置bean的时候class属性需要指向工厂类的路径,同时需要指定factory-method属性,属性值为工厂的静态方法
<?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 id="userAction" class="com.cdsxt.action.UserAction"></bean> <!-- 静态工厂创建bean --> <beanid="userAction1" class="com.cdsxt.factory.UserActionFactory" factory-method="getUserAction"></bean> </beans> |
2.7.3 使用实例工厂创建对象
创建实例工厂类,提供一个非静态的方法返回目标类的对象
配置实例工厂bean
配置目标类bean, 配置factory-bean属性,值指向工厂bean的id;配置factory-method属性,值为工厂类中的get方法
<?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 id="userAction" class="com.cdsxt.action.UserAction"></bean> <!-- 实例工厂创建bean --> <bean id="userActionFactory" class="com.cdsxt.factory.UserActionFactory"></bean> <bean id="userAction1" factory-bean="userActionFactory" factory-method="getUserAction"></bean> </beans> |
2.8Bean标签的常用属性
lid : 给实例对象取一个名字,通过这个名字来标识一个对象,该属性值不能包含特殊符号,一般使用首字母小写的类名
lname(不推荐使用): 功能和id一样,但是可以包含特殊符号,是为了整合struts框架遗留的,现在基本不用
lclass : 指定配置对象所在类的全限定名:包名+类名
lscope : 用于配置spring bean的作用域
singleton : 默认值,表示该对象的实例为单例(如果配置多个bean,则存在多个对象)
prototype : 多例
request: 创建对象并放到request作用域
session: 创建对象并放到session作用域
globalSession: 创建对象并放到globalSssion作用域
Init-method
Destroy-method
Lazy
3DI:依赖注入
3.1Dependency injection.
什么是依赖?
一个对象完成业务功能需要依赖另一个对象,比如service功能需要依赖于dao
什么是注入?
就是在获取一个对象时,该对象所依赖的实例已经
由spring替我们分配了
3.2属性注入的两种方式
set方法注入(重点掌握)
xml方式配置DI时,必须为属性添加set方法,注解不需要
xml方式配置DI(基本类型):
<?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 id="phone" class="com.cdsxt.po.Phone"> <property name="name" value="xiaomi"></property> <property name="price" value="2888.00"></property> </bean> </beans> |
xml方式配置DI(注入对象):
<?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 id="userAction" class="com.cdsxt.action.UserAction"> <property name="userService" ref="userService"></property> </bean> <bean id="userService" class="com.cdsxt.service.UserService"></bean> </beans> |
xml方式配置DI(复杂类型)
import java.util.List; import java.util.Map; import java.util.Properties; public class Dependency { private int[] array; private List<String> list; private Map<String, String> map; private Properties properties; public int[] getArray() { return array; } public void setArray(int[] array) { this.array = array; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } } |
Xml配置文件:
<?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 id="dependency" class="com.cdsxt.po.Dependency"> <!-- 注入数组 --> <property name="array"> <array> <value>1</value> <value>2</value> <value>3</value> </array> </property> <!-- 注入list --> <property name="list"> <list> <value>list1</value> <value>list2</value> <value>list3</value> </list> </property> <!-- 注入map --> <property name="map"> <map> <entry key="k1" value="value1"></entry> <entry key="k2" value="value2"></entry> <entry key="k3" value="value3"></entry> </map> </property> <!-- 注入properties --> <property name="properties"> <props> <prop key="p1">v1</prop> <prop key="p2">v2</prop> <prop key="p3">v3</prop> </props> </property> </bean> </beans> |
名称空间设置属性值
Spring2.X以后提供了名称空间p的属性输入方式
l第一步:引入p名称空间
xmlns:p="http://www.springframework.org/schema/p"
l第二步:使用p名称空间
普通属性: p:属性名=””
对象类型属性: p:属性名-ref=””
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- p名称空间注入 --> <bean id="phone" class="com.cdsxt.po.Phone" p:name="Iphone" p:price="8888.88"/> <bean id="userAction" class="com.cdsxt.action.UserAction" p:userService-ref="userService" /> <bean id="userService" class="com.cdsxt.service.UserService"></bean> </beans> |
SpEL的方式属性注入
Spring3.X以后提供了SpEL的方式注入属性
语法:
<property name=”属性名” value=”#{ }”>
<?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"> <!-- SpEl注入属性 --> <bean id="phone" class="com.cdsxt.po.Phone"> <!--字符串 --> <property name="name" value="#{'huawei'}"></property> <!-- 数字 --> <property name="price" value="#{8888.88}"></property> </bean> <bean id="userAction" class="com.cdsxt.action.UserAction"> <!--对象 --> <property name="userService" value="#{userService}"></property> </bean> <bean id="userService" class="com.cdsxt.service.UserService"></bean> </beans> |
有参构造函数注入(了解)
创建无参构造函数
创建有参构造函数
在xml文件中采用<constructor-arg name=”” value=”” />注入
<?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 id="phone1" class="com.cdsxt.po.Phone"> <constructor-arg value="meizu"></constructor-arg> <constructor-arg value="2222.22"></constructor-arg> </bean> </beans> |
4Demo2: 注解方式配置IOC
4.1导入jar
l4+1(4个核心jar + commons-logging)
lspring-aop : 使用注解会使用到该jar
4.2创建类
4.3创建配置文件
l在demo1的基础上添加context约束
l在applicationContext.xml中添加注解的配置(非常重要):
<context:component-scan base-package=”要扫描的包”>
l属性注解
如果bean的装配使用xml,依赖的装配使用注解,可以使用以下配置
<context:annotation-config>
该配置只会扫描属性上的注解(通常是@Autowired)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <context:component-scan base-package="com.cdsxt"></context:component-scan> </beans> |
4.4配置组件和DI
l在java类上添加@Component(“id”)注解(id可选),告诉spring这是一个组件,交由spring管理,这一步相当于xml当中的<bean>配置
l除了@Component以外还有其他几个注解配置组件:
n@Controller
n@Service
n@Repository
l配置组件之后,如果未指定id,默认给对象配置一个类名首字母小写的id,如果以显式的配置了id,则默认的就不存在了
l如果有依赖,在依赖上添加@Autowired注解,使用该注解,没有set方法也可以
l除了@Autowired,@Resource也可以用来装配bean
@Autowired默认按类型进行装配(该注解由spring提供),默认情况下必须要求依赖对象存在,如果要允许null值,可以设置required属性为false,如:@Autowired(required=false);如果想要使用名称装配,可以结合使用@Qualifier,如:@Autowired@Qualifier(“name”);
@Resource(该注解由j2EE提供),默认按照名称进行装配,名称可以通过name属性进行指定,如果未指定name属性,当注解写在字段上是,默认取字段名查找,当找不到名称匹配的bean时,才按照类型进行装配.但是如果name属性一旦指定,将只会按照名称进行装配
4.5测试
5AOP
5.1什么是AOP
lAOP全称 aspect oriented program,中文名为面向切面编程.
lAOP的OOP的延续,是spring框架中的一个热点和优势,利用AOP可以对业务的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低.提高代码的复用性,同时提高开发效率
lAOP采取了横向抽取的机制,取代了传统纵向继承体系的重复性代码
l应用场景:日志, 事务管理, 缓存, 性能检测等
lSpring AOP 使用纯java实现,不需要专门的编译过程和类加载器,在运行期通过动态代理的方式向目标类织入增强代码
lAspectj 是一个基于java语言的AOP框架,从spring2.0开始,引入了对于Aspectj的支持
5.2AOP的专有名词
ltarget : 目标类
ljoinpoint : 连接点是指所有可能织入通知的方法,理论上大部分方法都是连接点
lpointcut : 切入点, 已经被增强(或者说织入通知)的方法
ladvice: 通知,增强的方法,比如日志,事务
laspect : 切面,是指advice和pointcut的结合
lweaving: 织入,将advice应用到目标对象来创建新的代理对象的过程
6Demo3: xml方式配置AOP
6.1导入jar
l4+1(4个核心jar + commons-logging)
lSpring的aop jar
nspring-aop > aopalliance(aop联盟)
laspects的jar(集成aspectj)
nspring-aspects > aspectjweaver
6.2创建业务类和增强类
业务类:UserService
增强类:LogAspect
6.3创建配置文件
l添加约束:bean,aop
l配置bean
l配置aop:切点+切面
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <bean id="userService" class="com.cdsxt.service.UserService"></bean> <bean id="logAspect" class="com.cdsxt.aspect.LogAspect"></bean> <!-- 配置aop --> <aop:config> <!--配置切点 --> <aop:pointcut expression="execution(* com.cdsxt.service.UserService.addUser(..))" id="userServiceAddPointcut"/> <!-- 配置切面:切点 + 通知 --> <aop:aspect ref="logAspect" > <aop:before method="log" pointcut-ref="userServiceAddPointcut"/> </aop:aspect> </aop:config> </beans> |
6.4测试
6.5通知的类型
lbefore:前置通知,在目标方法被调用之前调用通知功能
lafter:后置通知,在目标方法完成之后调用通知,不关心目标方法的输出
lafter-returning:返回通知,在目标方法成功执行之后调用通知
lafter-throwing:异常通知,在目标方法抛出异常之后执行通知
laround:环绕通知,在调用前后都会执行
n环绕通知接收一个参数: ProceedingJoinPoint
6.6切入点表达式
lexpression="execution(* service.UserService.addUser(..))"
[访问修饰符] 方法返回类型 包名.类名.方法名(参数)
访问修饰符通常省略
l几种常用写法
n* com.sxt.service.UserService.addUser(..)
n* com.sxt.service.UserService.*(..)
n* com.sxt.service.UserService.add*(..)
n* com.sxt.service.UserService.*do(..)
n* com.sxt.service.*.*do(..)
n* com.sxt.service.*Impl.*(..)
7Demo4: 注解方式配置AOP
7.1导入jar
l4+1(4个核心jar + commons-logging)
lSpring的aop jar
nspring-aop > aopalliance(aop联盟)
laspects的jar(集成aspectj)
nspring-aspects > aspectjweaver
7.2创建业务类和增强类
业务类:UserService
增强类:LogAspect
7.3配置组件和切面
l创建配置文件
l引入约束:beans, aop, context
l配置组件的包扫描:
n<context:component-scan base-package=”” />
l配置开启aop自动代理
n<aop:aspectj-autoproxy />
l在组件上添加@Component注解
l在切面上添加@Aspect注解
l在通知类的方法上添加切入点表达式的注解
7.4测试
8JDBCTemplate
lSpring提供了用于操作JDBC的工具类,类似于DBUtils
lSpring对于不同持久化技术提供了不同的模板类
8.1回顾JDBC操作数据库
1.加载驱动类
2.传入参数信息获取连接
3.通过连接获取PrepareStatement对象
4.通过PrepareStatemen对象执行sql语句
5.从ResultSet获取结果集
8.2通过JDBCTemplate操作数据库
8.2.1 导入jar
l4+1
lSpring-jdbc
lSpring-tx 事务包
lmysql.connector数据库驱动包
8.2.2 创建DriverManagerDataSource对象,设置数据库信息:驱动,数据库地址,账号,密码
8.2.3 创建JdbcTemplate对象,设置数据源
8.2.4调用JdbcTemplate对象中的方法实现操作
l增(JdbcTemplate.update)
String sql = “insert into user values(null, ?, ?)”;
int row = jdbcTemplate.update(sql, “andy”, 50);
l删(JdbcTemplate.update)
String sql = “delete from user where name=?”;
int row = jdbcTemplate.update(sql, “andy”);
l改(JdbcTemplate.update)
String sql = "update user set age=? where name=?";
int row = jdbcTemplate.update(sql, 18, "jiayu");
l查1(查询返回某一个指定类型的值)
jdbcTemplate.queryForObject( String sql, Class<T> requireType)
比如 select count(*) from user,返回值是int, 则第二个参数传Integer.class
l查2(查询一个对象)
jdbcTemplate.queryForObject(String sql, RowMapper<T> rowMapper, Object ...args)
调用该方法,需要注意的是该方法需要传入一个RowMapper类型的对象,spring只提供了接口,需要自己手动去实现,写法相当于jdbc获取结果当中while(resultSet.next()){}循环体内的部分
l查3(查询一个对象集合)
jdbcTemplate.query(String sql, RowMapper<T> )
8.3以配置方式注入dataSource和jdbcTemplate
9Spring的事务管理
9.1什么是事务
一组对于数据库的操作,是最小的数据库操作单元.要么都成功,有么都不执行.
Mysql是支持事务的
Mysql是事务是自动提交的.
在mysql的jdbc当中进行事务管理:
1.手动开启事务
2.手动提交事务
3.回滚
9.2事务的特性(ACID)
原子性: 一个事务单元里面的多个数据库操作,不可分割
隔离性: 一个事务操作不能影响其他事务
一致性:
持久性:
9.3并发事务下可能出现的问题
脏读: 是一个事务读到了另一个事务没有提交的数据
不可重复读: 针对的是记录的修改操作
幻读: 针对的是数据增删操作
9.4解决方法:设置数据的隔离级别
读未提交: 一个问题都没解决
读已提交: 解决了脏读的问题
可重复读: 解决了不可重复读和脏读的问题
串行化: 解决了所有问题..
数据库是有默认的隔离级别的:
Mysql : 可重复读
Oracle: 读已提交
9.5JDBC当中的事务处理
开启事务
Connection.setAutoCommit(false)
提交事务
Connection.commit()
事务回滚
Connection.rollback()
9.6Spring当中的事务处理
平台事务管理器:
PlatformTransactionManager
9.7三种事务处理方案
1.编程式事务
2.声明式事务
2.1 xml方式配置事务
2.2注解方式配置事务
相关推荐
- 自己动手写Android数据库框架_android开发数据库搭建
-
http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...
- 谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic
-
智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...
- 工信部:着力推动大模型算法、框架等基础性原创性的技术突破
-
工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...
- 乒乓反复纠结“框架不稳定”的三个小误区
-
很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...
- 前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈
-
IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...
- 三种必须掌握的嵌入式开发程序架构
-
前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...
- 怪不得别人3秒就知道软考案例怎么做能50+
-
软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...
- UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透
-
10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...
- 勒索软件转向云原生架构,直指备份基础设施
-
勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...
- ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来
-
在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...
- APP 制作界面设计教程:一步到位_app界面设计模板一套
-
想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...
- MCP 的工作原理:关键组件_mcp部件
-
以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...
- 软件架构_软件架构师工资一般多少
-
软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...
- 不知不觉将手机字体调大!老花眼是因为“老了吗”?
-
现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...
- 8000通用汉字学习系列讲座(第046讲)
-
[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)