Java EE SSH框架之Spring(5)——Spring中的AOP事务

Java EE博客网站开发实战:SSH框架与MySQL整合 博客网站的架构设计通常遵循MVC(Model-View-Controller)模式,可以分为表示层、业务层和持久层。表示层负责与用户直接交互,如展示博客文章、用户评论等;业务层处理博客的具体业务逻辑,例如文章的发布、编辑和管理;持久层主要负责数据的持久化存储,以及与数据库的交互。 阅读详情

一、相关概念

1.1、事务

 1.1.1、事务特性

       原子性(acid):强调事务不可分割

       一致性:事务的执行前后数据的完整性保持一致

       隔离性:一个事物执行的过程中,不应该受到其他事物的干扰

       持久性:事务一旦结束,数据就持久到数据库


   1.1.2、事务的并发问题

        脏读:一个事务读到了另一个事务的未提交的数据

        不可重复读:一个事务读到了另一个事务已经提交的update的数据导致多次查询的结果不一致;

        幻读/虚读:一个事务读到了另一个事务已经提交的insert的数据导致多次查询的结果不一致。


   1.1.3、事务的隔离级别

        1——读未提交:脏读、不可重复读、幻读都可能发生;

        2——读已提交:避免脏读,但是不可重复读和幻读有可能发生;(Oracle默认)

        4——可重复读:避免脏读和不可重复读,但是幻读有可能发生;(MySQL默认)

        8——串行化:避免脏读、不可重复读、幻读。


1.2、Spring封装了事务管理代码

    事务的操作有打开事务、提交事务、回滚事务

   1.2.1、真正事务操作对象

        因为在不同平台,操作事务的代码各不相同,Spring提供了一个接口PlatformTransactionManager

         实现类: DataSourceTransactionManager  (使用SpringJDBC或Mybatis进行持久化数据)

                       HibernateTransactionManager   (使用Hibernate版本进行持久化数据时使用)

            

   1.2.2、事务定义信息         

       即Spring管理事务的属性,分为:事务的隔离级别、是否只读、超时信息、事务的传播行为(Spring才有)




二、Spring管理事务的三种方式

已转账业务为例:



下面先模拟不加事务时的转账

先定义两个接口

ITransferDao

package com.zl.dao;

public interface ITransferDao {
	void transferMoney(Integer id, Double money); //转钱
	void receiptMoney(Integer id, Double money); //收钱
}

ITransferService

package com.zl.service;

public interface ITransferService {
    void transfer(Integer from, Integer to, Double money);
}

两个接口的实现类

TransferDaoImpl

package com.zl.dao;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class TransferDaoImpl extends JdbcDaoSupport implements ITransferDao {

	@Override
	public void transferMoney(Integer id, Double money) { //转钱
		getJdbcTemplate().update("update transfer set money=money-? where id=?",money,id);
	}

	@Override
	public void receiptMoney(Integer id, Double money) { //收钱
		getJdbcTemplate().update("update transfer set money=money+? where id=?",money,id);
	}
}

TransferServiceImpl

package com.zl.service;

import com.zl.dao.TransferDaoImpl;

public class TransferServiceImpl implements ITransferService {
	private TransferDaoImpl tdi;
	
	public TransferDaoImpl getTdi() {
		return tdi;
	}
	public void setTdi(TransferDaoImpl tdi) {
		this.tdi = tdi;
	}
	@Override
	public void transfer(Integer from, Integer to, Double money) {
		//减钱
		tdi.transferMoney(from, money);
//		int d = 1/0;   //模拟转钱过程中间可能会发生的异常
		//加钱
		tdi.receiptMoney(to, money);
	}		
}
连接数据库的属性文件db.properties:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.user=root
jdbc.password=123456

Spring容器:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
	
	<!-- 指定Spring读取db.properties配置 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 1.连接池 -->	
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 2.DAO-->
	<bean name="tdi" class="com.zl.dao.TransferDaoImpl">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 3.Service -->
	<bean name="transferservice" class="com.zl.service.TransferServiceImpl">
		<property name="tdi" ref="tdi"></property>
	</bean>
</beans>
测试DemoTest.java
package com.zl.test;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zl.service.ITransferService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class DemoTest {
	@Resource(name="transferservice")
	private ITransferService its;
	
	@Test
	public void fun1() {	
		its.transfer(1, 2, 999.8d);
	}
}

Junit测试后,数据库表更新后结果:


在TransferServiceImpl中添加下面的异常,再测试:

int d = 1/0;

    id为1的money少了999.8,id为2的账户money并为增加,因为在此过程中发生了异常,转账过程中断了,这999.8“不翼而飞”,说明添加事务是必要的,下面介绍三种添加事务的方式。



准备工作:将核心事务管理器配置到Spring容器

<!-- 事务核心管理器,封装了所有事物的操作,依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
编码式
(编码式不是指的utf-8、gb2312这种编码,就是写代码的意思)

在Spring容器(applicationContext.xml)中添加事务模板对象


然后将事务模板对象添加到Service里


最后applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
	
	<!-- 事务核心管理器,封装了所有事物的操作,依赖于连接池 -->
	<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 事务模板对象 -->
	<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
		<property name="transactionManager" ref="transactionManager"></property>
	</bean>
	
	<!-- 指定Spring读取db.properties配置 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 1.连接池 -->	
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 2.DAO-->
	<bean name="tdi" class="com.zl.dao.TransferDaoImpl">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 3.Service -->
	<bean name="transferservice" class="com.zl.service.TransferServiceImpl">
		<property name="tdi" ref="tdi"></property>
		<property name="tt" ref="transactionTemplate"></property>
	</bean>
</beans>

TransferServiceImpl

package com.zl.service;

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import com.zl.dao.TransferDaoImpl;

public class TransferServiceImpl implements ITransferService {
	private TransferDaoImpl tdi;
	private TransactionTemplate tt;
	
	public TransactionTemplate getTt() {
		return tt;
	}
	public void setTt(TransactionTemplate tt) {
		this.tt = tt;
	}
	public TransferDaoImpl getTdi() {
		return tdi;
	}
	public void setTdi(TransferDaoImpl tdi) {
		this.tdi = tdi;
	}

	@Override
	public void transfer(Integer from, Integer to, Double money) {
		tt.execute(new TransactionCallbackWithoutResult() { //excute事务的打开和关闭已经封装好了
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				//减钱
				tdi.transferMoney(from, money);
				//加钱
				tdi.receiptMoney(to, money);
			}
		});		
	}
}

Junit测试后,数据库表更新后结果:

加入int d=1/0;  发生了异常,但是数据库表刷新后,数据未改变!



XML配置(AOP)

(1)导包

    4+2+connector+test+jdbc+aop+aspect+aop联盟+weaving织入

 

(2)导入新的约束

如果不清楚怎么导入约束的,可以参考我第二篇关于Spring的

一共四个命名空间





(3)配置通知



transfer方法还是最初的,不用添加任何事务代码



(4)配置将通知织入目标


applicationContext.xml最终为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
	<!-- 事务核心管理器,封装了所有事物的操作,依赖于连接池 -->
	<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 事务模板对象 -->
	<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
		<property name="transactionManager" ref="transactionManager"></property>
	</bean>
	<!-- 配置事务通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 以后配置大量事务时,需要使用通配符配置增删改查 -->
			<!-- 以方法为单位,指定方法应该有什么事务属性,isolation隔离级别,propagation传播行为,read-only是否只读 -->
			<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="motified*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="get*"isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
			<tx:method name="find*"isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
			<!-- 本次需要 -->
			<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置织入 -->
	<aop:config>
		<aop:pointcut expression="excution(* com.zl.service.*ServiceImpl.*(..))" id="txpointcut"/>
		<!-- 配置切面 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txpointcut"/>
	</aop:config>
	
	<!-- 指定Spring读取db.properties配置 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 1.连接池 -->	
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 2.DAO-->
	<bean name="tdi" class="com.zl.dao.TransferDaoImpl">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 3.Service -->
	<bean name="transferservice" class="com.zl.service.TransferServiceImpl">
		<property name="tdi" ref="tdi"></property>
		<property name="tt" ref="transactionTemplate"></property>
	</bean>
</beans>



注解配置(AOP)

(1)导包(同XML配置)

(2)导入约束(同XML配置)

(3)开启注解管理事务

       不用配通知和事务,在编码式的基础上只用添加:

     

(4)使用注解(transfer方法上)


如果一个类中有很多个事务,可以把该注解放在类上!!!


基于SSH框架的Java购物网站实战项目 特性描述推荐做法实例数量单例(每个Action路径一个实例)不依赖实例变量创建时机第一次请求时创建无特殊需求无需干预销毁时机应用关闭时由GC回收无需手动释放资源并发访问多线程共享同一实例方法内使用局部变量通过严格遵守无状态编程规范,可以从根本上规避因Action生命周期带来的并发陷阱。 阅读详情

相关推荐

Java Web经典框架SSH环境搭建实战指南

SSH(Struts 2 + Spring + Hibernate)是Java EE企业级开发中经典的三层架构整合方案,分别对应表现层、业务逻辑层和持久层。Struts 2基于MVC模式,通过Action控制器处理HTTP请求,实现视图与控制分离;Spring框架通过IoC容器管理Bean依赖关系,并结合AOP实现声明式事务控制;Hibernate作为ORM框架,将Java对象映射到数据库表,屏蔽JDBC底层细节,提升数据访问效率。

weixin_35899324的博客 1093

Spring(三)异步调用、定时器、缓存

@Async、@Scheduled、@Cacheable

HK的博客 4057

SSH事务整合实战:构建高效Java后端解决方案

SSH框架是Java EE企业级开发中的一个经典组合,分别指的是Spring、Struts和Hibernate。Spring负责企业级服务的整合,Struts承担Web层的MVC框架职责,而Hibernate则扮演着数据持久化的角色。这种整合模式为开发人员提供了清晰的分层结构,简化了事务的管理,降低了企业应用开发的复杂性。

weixin_35762258的博客 896

脏读、不可重复读、幻读

1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。 2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务

chengwai26的博客 451

Java Web经典SSH框架实战项目——学校管理系统设计与实现

在一个学生选课系统中,如果插入学生记录成功,但关联课程失败,怎么办?数据就乱了!这时候就需要事务登场了。SSH框架或许已经不再前沿,但它教会我们的东西,至今仍在发光:分层架构让代码更清晰;控制反转让组件更解耦;面向切面让横切关注点更优雅;ORM映射让数据库操作更简单。下次当你轻松写出@Autowired的时候,不妨想想——是谁,为我们铺下了这条路?“我们站在时间的肩膀上,回望过去,是为了走得更远。” 🌟。

weixin_42509513的博客 1053

精通SSH框架:Struts2+Spring2+Hibernate3综合指南

本文还有配套的精品资源,点击获取 简介:Struts2、Spring2 和 Hibernate3 组合形成了 Java Web 开发中的“SSH”三位一体,提供了完整的模型-视图-控制器(MVC)架构、事务管理和数据持久化解决方案。本课程旨在介绍这三个框架的核心概念、配置方法和在企业级应用中的协同工作方式,帮助开发者提升开发效率和系统的可维护性。 1. Strut...

weixin_34413326的博客 904

Spring事务管理 与 SpringAOP

1,Spring事务的核心接口   Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。  Spring事务管理涉及的接口的联系如下: 1.1事务管理器 Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久...

weixin_30652491的博客 355

SSH框架实战项目:基于Java Web的经典应用

本文还有配套的精品资源,点击获取 简介:该项目基于Spring、Struts和Hibernate(SSH)技术栈,展示了如何将这些框架整合应用于Java Web开发。项目旨在提供一个学习平台,使初学者能够理解Spring的依赖注入与事务管理,掌握Struts的MVC架构和请求处理,以及了解Hibernate的ORM映射和数据库操作。项目包括源代码、配置文件、数据库脚本和文档...

weixin_31139479的博客 939

Spring事务管理之AOP方法

使用AOP完成Spring事务管理 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" propagation="REQUIRED" />

BryantLmm的博客 786

无处不在的Spring AOP事务及踩过的坑

无处不在的Spring AOP事务及踩过的坑.......................

电商项目功能简述

1.电商行业的技术特点 1.技术性 2.技术范围广 3.分布式 4.高并发,集群,负载均衡,高可用 5.海量数据 6.业务复杂 7.系统安全 2.电商行业的模式 B2B:企业到企业,商家到商家.代表:阿里巴巴 B2C:商家到客户.代表:京东.淘宝商城 C2C:客户到客户.淘宝集市 O2O:线上到线下 3.B2C电商系统架构功能模块 4.B2C电商系统架构功能描述 后台管理系统:管理商品、订单、类...

weixin_45116848的博客 9744

spring事务管理 和 Spring AOP

Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

sdg_advance的博客 1187

java系列:什么是SSH?什么是SSM?SSH框架和SSM框架的区别

什么是SSH?什么是SSM?SSH框架和SSM框架的区别

weixin_54626591的博客 5243

【文章阅读+代码复现】Point-GNN

Brief 在3D点云语义分割方法中,GNN已经做了很多可用的方案,但是在目标检测上依旧是采用比较传统的CNN和稀疏卷积的组合,这一篇文章是研究了图卷积在3D检测的中的用法。来自卡内基梅隆大学。已经被CVPR2020接收. 这里是 paper 这里是 code Abstruct 一个采用GNN设计的3D目标检测框架 过程是先将点云场景编码成图结构,随后设计了一个叫point-GNN的网络结构,在...

有所为,有所成长 1万+

Centos7.9上安装glibc2.28遇到/usr/bin/ld: cannot find -lnss_test2问题

Centos7.9安装glic2.28遇到-lnss_test2问题及解决方案。

freflying1119的博客 2898

SSH和SSM都是Java开发中的框架技术,而Spring则是Java开发中的一个核心框架

其中,Struts负责MVC的Controller层,Spring负责业务逻辑层(Service)以及数据访问层(DAO),Hibernate则负责持久层,也就是数据库操作。Spring:Spring是一个开源的Java EE应用程序框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC/ORM等众多的企业级应用模块,并支持与多种Web服务器、持久层框架、模板引擎等进行集成。其中,Spring负责整体架构的管理,包括依赖注入、事务管理等;

[Blog][Domain] programb.blog.youkuaiyun.com 839

海康威视web控件开发+vue结合做网页开发

需求:vue的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能. 准备:web开发包(包含插件以及demo,在海康官网即可下载32位64位的都有.那些需要积分下载的博主良心不疼么.) 点击这里下载:链接: https://pan.baidu.com/s/12FrbycWyWWyiRJH5Yd1tPA 提取码: gam5 开始开发: 1.安装demo目录下的WebComponentsKit.exe插件(根据自己的浏览器以及系统选择32位还是64位的插件) 2.打.

u013682258的博客 8484

SSH框架简介

什么是SSH? SSH是JavaEE中三种框架(Struts+Spring+Hibernate)的集成框架,是目前比较流行的一种Java Web开源框架。 学习SSH方法 ? JavaEE学习就从最通用的MVC框架Struts开始学习,然后到Hibernate,最后是Spring。 对于Struts来说,Struts1和Struts2区别较大。还是把最原始的东西多看一下,对我们程序员来说可...

Lamitry的博客 3万+

Mooncake架构:基于KVCache解耦的LLM推理优化方案

在大语言模型推理中,KVCache是Transformer解码过程中用于缓存历史Key/Value向量的核心数据结构,它避免了序列重复计算,但会随上下文长度线性增长,成为显存占用的主要部分。其原理是在自回归生成时,将已计算过的注意力键值对存储下来,供后续Token生成时直接使用,从而提升计算效率。这项技术的核心价值在于,通过高效管理KVCache,可以显著降低长序列推理时的显存压力,提升GPU资源利用率。在实际应用场景中,尤其是在处理长上下文对话、高并发请求时,KVCache的管理策略直接决定了服务的吞吐量

weixin_35753431的博客 533

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1234

java ssh框架 struts spring hibernate 简介

目录 什么是SSH框架 浅谈Struts 什么是Struts Struts的核心构成 为什么使用Struts 浅谈Hibernate 什么是Hibernate Hibernate的核心构成 浅谈Spring 为什么使用Spring 什么是SSH框架 官方的说法:SSH是 struts+spring+hibernate的一个集成框架,是目前较流行的一种web应用程序开源框架。 SSH不是一个框架,而是把多个框架(Struts、Spring以及Hibernate)紧密的结合在一起.

whatday的专栏 1752

dji psdk开发 关于SDK认证芯片的使用

Payload SDK V3.10.0 于 2025-1-8 发布,增加了 Matrice 4T/4E 机型支持,同时也增加了 DJI SDK 认证芯片(DJI SDK CC)功能支持。关于认证芯片的介绍大疆 SDK 认证芯片(DJI SDK Certified Chip),简称 DJI SDK CC,用于认证基于 DJI Eport/Eport-Lite 接口开发的第三方负载设备,确保设备能够正常工作并与无人机可以进行有效通信,起到负载安全认证和功能授权的作用。

热爱生活,忠于自己 2146

Java企业级框架技术-Topic 1 SSH框架

什么是框架?为什么要使用框架?常用的技术框架有哪些? 框架概念 框架技术解决的问题 使用框架技术能够解决以下三方面的问题。 实现常见任务,如数据转换、日志等。软件架构方案。 对特定领域问题的可重用、易扩展的解决方案。 什么是框架     框架(即Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。框架是一个提供了可重用的公共结构的半成品,它

程序媛一枚 3016

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaEE框架学习—Spring

文章目录一、Spring 参考文章: Spring常见面试题总结(超详细回答) 一、Spring

weixin_40815218的博客 2831

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java EE | 浅谈SSH三大框架及整合流程

Struts2、Structs2 标签、Hibernate、Spring核心技术、SSH框架整合

ZY-JIMMY 3606

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Java EE SSH框架之Spring(4)——Spring整合JDBC
下一篇: Java EE SSH框架之整合(登录功能)
zl_StepByStep
博客等级 码龄10年 154粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值