java—Spring框架

Spring

简介

        Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

Spring是什么?

        Spring是一个轻量级的,IoCAOP一站式java开发框架,是为了简化企业级应用开发而生。

名词解释:
        轻量级:Spring框架所使用的jar都比较小,Spring核心功能的所需的jar总共在3M左右。Spring框架运行占用的资源少
        IoC(Inverse of Control):控制反转。当我们需要使用某一个对象的方法时,在传统模式下有两种方式:①原始做法:主动创建该对象;②简单工厂模式:找到该对象所在工厂,主动通过工厂获取该对象。
        传统的方法描述中都有“主动”,也就是在编写代码时,开发者必须要显现的获取该对象,这样做有两大缺点,高耦合度,并且在后期对项目的升级维护。而使用了Spring框架后,IoC很巧妙的解决了这一问题,可以将所需要的对象交由Spring框架创建管理,我们在哪里使用,在哪里定义一个接收的容器即可。由于对象由开发者管理变更为由Spring框架管理,所以称之为控制反转。
        AOP(Aspect Orient Programming):AOP也就是面向切面编程(一种编程思想),作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面。AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。    简单讲就是可以为程序动态的添加某种功能,而不需要修改原来的代码。如对数据库修改需要提交事务、打印日志文件等。

此处并不需要担心对IoC和AOP不理解。下面对IoC和AOP进一步解释

案例演示

IoC:

IoC(控制反转):IoC不是一项技术,而是一种设计思想,将原来在程序中手动创建对象的控制权交由Spring框架来管理。IoC容器负责对象的实例化、对象的初始化、对象和对象之间的依赖关系、对象的销毁,对象提供对象的查找等操作,对象的整个生命周期都是由容器来控制的。当我们需要使用的时候直接从IoC容器中获取即可,我们只需要定义一个对象容器。

Demo前提,创建一个maven项目
        导入spring框架所需依赖:

    <!-- spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency>

Spring Bean管理:

基于xml文件配置方式

在resources目录下创建spring配置文件spring.xml
创建方式如图所示:

spring.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:配置需要Spring管理的类id:生成的对象名称class:类全名name:对象别名, 可以定义多个scope:singleton(默认值):在Spring中只存在一个bean实例, 即单例模式prototype:原型, getBean()时每次都会创建一个新的对象, 即多例模式--><bean id="user" name="user2,user3" class="com.flash.demo.model.User" scope="prototype"/>
</beans>
创建用户类:
package com.flash.demo.model;/*** @author flash* @date 2024/07/11 10:14* 功能描述:用户类*/
public class User {private Integer id;private String name;private Integer age;// 无参构造器public User() {System.out.println("User无参构造器");}public User(Integer id, String name, Integer age) {System.out.println("User三参构造器");this.id = id;this.name = name;this.age = age;}// 由于框架要使用类反射, 所以在创建类时, 将对应的属性的getter和seter方法生成, 类反射会用到public Integer getId() {return id;}public void setId(Integer id) {this.id = id;System.out.println("setId被调用");}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
Test测试类:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author flash* @date 2024/07/11 10:16* 功能描述:获取Spring框架生成的User对象*/
public class Test1 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Object user = applicationContext.getBean("user");System.out.println(user);System.out.println("user的hash值 = " + user.hashCode());Object user2 = applicationContext.getBean("user2");System.out.println("user2的hash值 = " + user2.hashCode());}
}

当spring.xml文件中User类scope = singleton时运行结果:

当spring.xml文件中User类scope = prototype时运行结果:

对象初始化:

以下演示scope均使用默认的单例模式

方式1(setter方法):

spring.xml更改:

    <bean id="user" name="user2,user3" class="com.flash.demo.model.User"><property name="id" value="1"/><property name="name" value="张三"/><property name="age" value="21"/></bean>

该方式会调用无参构造器创建一个对象实例,然后调用该对象的setter方法完成初始化
运行结果如果所示:

方式2(构造器):

spring.xml更改:

    <bean id="user" name="user2,user3" class="com.flash.demo.model.User" scope="prototype"><constructor-arg name="id" value="1"/><constructor-arg name="name" value="张三"/><constructor-arg name="age" value="21"/></bean>

该方式会调用此处定义的三个参数的构造器创建一个对象实例
运行结果如果所示:

基于注解方式
开启注解扫描

采用注解的方式实现IoC需要开启注解扫描,spring.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"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 https://www.springframework.org/schema/context/spring-context.xsd"><!--开启注解扫描, 检测添加有 spring 注解标签的类--><context:component-scan base-package="com.flash.demo"/>
</beans>
为User类添加注解

测试类:
import com.flash.demo.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author flash* @date 2024/07/11 10:16* 功能描述:获取Spring框架生成的User对象, 注解方式*/
public class Test2 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = applicationContext.getBean("user", User.class);System.out.println(user);}
}
运行结果:

数据库交互

Spring实现与数据库(mysql)交互,使用阿里数据源提供的druid(德鲁伊)

与数据库交互所需依赖:

        <!--数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><!-- 阿里数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

spring.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"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 https://www.springframework.org/schema/context/spring-context.xsd"><!--开启注解扫描, 检测添加有 spring 注解标签的类--><context:component-scan base-package="com.flash.demo"/><!--导入属性文件--><context:property-placeholder location="config.properties"/><!--spring 管理阿里巴巴数据库链接对象--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driverClassName}"/><property name="url" value="${url}"/><property name="username" value="${uname}"/><property name="password" value="${pwd}"/><property name="maxActive" value="${maxActive}"/><property name="initialSize" value="${initialSize}"/></bean><!--创建 spring 对 jdbc 进行封装的一个 jdbcTemplate,spring框架创建JdbcTemplate实例对象并将druidDataSource数据库连接对象注入到该对象中--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="druidDataSource"/></bean>
</beans>

创建config.properties配置文件

config.properties配置文件内容:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=Asia/Shanghai
uname=root
pwd=root
maxActive=20 # 最大连接数
initialSize=5 # 初始连接数

数据库交互层类:

package com.flash.demo.dao;import com.flash.demo.model.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;/*** @author flash* @date 2024/07/11 13:36* 功能描述:数据库交互*/
// @Repository(value = "userDao") // 指定对象名, 该对象被注入的地方可以通过对象名寻找此对象
@Repository
public class UserDao {@Resourcepublic JdbcTemplate jdbcTemplate;public void insertUser(User user) {System.out.println("添加user");jdbcTemplate.execute("INSERT INTO `user`(id,`name`,age) VALUES ('1','张三','21')");}
}

Service层类:

package com.flash.demo.service;import com.flash.demo.dao.UserDao;
import com.flash.demo.model.User;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** @author flash* @date 2024/07/11 13:51* 功能描述:*/
@Service(value = "userService")
public class UserService {// @Resource(name = "userDao") 通过对象名查找@Resource // 注解中没有指定对象名, 按照对象的类型寻找, 即UserDao/*也可以使用@Autowired注解标签, 可以添加在要注入的属性上, 也可以是属性的set方法上, 如果直接添加在属性上, 那么set方法可以需要默认情况加, 要注入的属性对象不能为空. @Autowired(required = true), false则可以为空, 允许为空时在值为空时, 不会报spring的错, 而是因为调用它的方法出现空指针异常.@Qualifier与@Autowired搭配使用, 指定对象名, 可以不要, 会根据属性类型自动寻找@Qualifier和@Autowired使用示例:@Autowired@Qualifier(value = "userDao")// 这个可以不要, 自动会找需要注意的是:在jdk8中可以使用@Resource注解, 在其他版本中可能无法使用. 就必须使用@Autowired注解标签, @Resource注解是由jdk提供的, 而@Autowired注解是由spring提供的*/UserDao userDao;public void save(User user) {userDao.insertUser(user);}
}

Test类:

import com.flash.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author flash* @date 2024/07/11 13:49* 功能描述:使用注入方式通过阿里的druid将User对象添加到数据库*/
public class Test3 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = applicationContext.getBean("userService", UserService.class);System.out.println("userService = " + userService);userService.save(null);}
}

运行结果:

在数据库中我们可以看到数据已经成功添加:

AOP

        AOP(Aspect Oriented Programming):意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容。利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分的耦合度降低,提交代码的复用性,也提高开发效率。
        OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
        AOP则是对业务处理过程中的切面进行提取,面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间的低耦合性的隔离效果。OOP和AOP这两种设计思想在目标上有着本质行的差异。

        使用案例:修改数据库数据事务的提交;打印日志,在程序运行期间将对应的操作通过日志的形式记录下来;权限判断,在执行方法前,判断是否有权限。

AOP的基本概念:

    连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点
    切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update
    被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
    通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通
    知分为方法执行前通知,方法执行后通知,环绕通知等. 目标(Target): 代理的目标对象(连接点,切入点所在类)
    代理(Proxy): 向目标对象应用通知时创建的代理对象

代码示例:

为了不和IoC的内容混淆,所以重新创建一个项目为读者演示AOP的功能

AOP所需依赖:
        <!-- AOP相关jar--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version></dependency><!-- spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency>
spring.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"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解扫描, 检测添加有 spring 注解标签的类--><context:component-scan base-package="com.flash.springPro2"/><!--启动 AspectJ 支持--><aop:aspectj-autoproxy/>
</beans>
更改UserDao类的内容

此处示例不需要与数据库交互,打印输出一句话即可。

package com.flash.demo.dao;import com.flash.demo.model.User;
import org.springframework.stereotype.Repository;/*** @author flash* @date 2024/07/11 13:36* 功能描述:*/
@Repository
public class UserDao {public void insertUser(User user) {System.out.println("添加user");}
}
前置通知
编写CommonUtil类:

为UserDao类的insertUser(User user)方法功能增强,编写CommonUtil类:

package com.flash.demo.common;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** @author flash* @date 2024/07/11 15:32* 功能描述:*/
@Component // spring 管理生成 CommonUtil 类的对象
@Aspect // 添加此标签类中的方法就是代理对象要调用的方法
public class CommonUtil {// 第一个 * 表示任意返回值,第二个 * 表示UserDao类下的任意方法,括号中的“..”表示该方法的所有重载方法@Before("execution(* com.flash.demo.dao.UserDao.*(..))") // ..是因为java中有重载, 表示对该方法名的所有方法均使用public void printLog() {System.out.println("方法执行成功");}
}
Test测试类:
import com.flash.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author flash* @date 2024/07/11 15:38* 功能描述:AOP测试类*/
public class Test4 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = applicationContext.getBean("userService", UserService.class);userService.save(null);}
}
运行结果:

可见在程序运行过程,先执行的是CommonUtil类下我们定义的方法,后执行我们所执行的业务逻辑代码,即添加User。这样的方法称之为前置通知。

以下测试所使用的测试类均相同,即Test4

后置通知
编写CommonUtil类
package com.flash.demo.common;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** @author flash* @date 2024/07/11 15:32* 功能描述:*/
@Component // spring 管理生成 CommonUtil 类的对象
@Aspect // 添加此标签类中的方法就是代理对象要调用的方法
public class CommonUtil {@AfterReturning("execution(* com.flash.demo.dao.UserDao.*(..))")public void commit() {System.out.println("提交事物");}
}
运行结果:

使用@AfterReturning定义的后置通知在我们执行的业务逻辑中如果出现异常则不执行,
如果使用@After定义后置通知,则不管是否出现异常都会执行该通知

异常通知
编写CommonUtil类
package com.flash.demo.common;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** @author flash* @date 2024/07/11 15:32* 功能描述:*/
@Component // spring 管理生成 CommonUtil 类的对象
@Aspect // 添加此标签类中的方法就是代理对象要调用的方法
public class CommonUtil {@AfterThrowing(value = "execution(* com.flash.demo.dao.UserDao.*(..))", throwing = "e")public void printException(Throwable e) {System.out.println("出异常了" + e.getMessage());}
}
更改UserDao类

为其添加一个异常

package com.flash.demo.dao;import com.flash.demo.model.User;
import org.springframework.stereotype.Repository;/*** @author flash* @date 2024/07/11 13:36* 功能描述:*/
@Repository
public class UserDao {public void insertUser(User user) {System.out.println("添加user");System.out.println(1 / 0);}
}
运行结果:

@AfterThrowing异常通知,当业务逻辑代码出现异常时通知

环绕通知
编写CommonUtil类
package com.flash.demo.common;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** @author flash* @date 2024/07/11 15:32* 功能描述:*/
@Component // spring 管理生成 CommonUtil 类的对象
@Aspect // 添加此标签类中的方法就是代理对象要调用的方法
public class CommonUtil {@Around("execution(* com.flash.demo.dao.UserDao.*(..))")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {Object proceed = null;try {System.out.println("保存日志");for (Object arg : joinPoint.getArgs()) {System.out.println(arg);}joinPoint.proceed();// 调用自己的方法, 有参数也可以接收参数System.out.println("提交事务");} catch (Throwable e) {System.out.println("异常" + e.getMessage());} finally {System.out.println("后置通知");}System.out.println("无论是否异常均执行");// 返回方法调用后的结果return null;}
}
运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/375635.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 &#xff1a; 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统&#xff0c;发现Packages的演示选项卡无法显示&#xff0c;我尝试从新安转了Packages 也是没作用&#xff0c;…

2024年新一代WebOffice内嵌网页组件——猿大师办公助手

背景 WebOffice控件这个中间件软件产品已存在二十余年&#xff0c;在国内众多大中小型企业、各级政府机关、科研机构和学校等事业单位的OA、ERP、文档系统、云盘等信息化B/S系统中得到了大量使用&#xff0c;为我国的信息化事业也做出了不小贡献。随着操作系统、浏览器及Offic…

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心&#xff0c;亚信安全新一代终端安全TrustOne自2023年发布以来&#xff0c;带动了数字化终端安全的革新。60%&#xff0c;安装部署及管理效率的提升&#xff1b;50%&#xff0c;安全管理资源的节省&#xff1b;100%&#xff0c;信创非信创场景的全覆盖。Trus…

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…

百度文心4.0 Turbo开放,领跑国内AI大模型赛道!

百度文心4.0 Turbo开放&#xff0c;领跑国内AI大模型赛道&#xff01; 前言 文心一言大模型 就在7月5日&#xff0c;在2024世界人工智能大会 (WAIC) 上&#xff0c;百度副总裁谢广军宣布文心大模型4.0 Turbo正式向企业客户全面开放&#xff01;这一举动直接引发了业界的关注。那…

SpringCloud教程 | 第八篇: 使用seata处理分布式事务

1、参考程序员江小北 2、打算降低nacos版本&#xff0c;先学通再看看升级到高版本nacos能不能正常使用。 3、nacos用1.4.1&#xff0c;正常启动单机版的了 4、seata用2.0.0 我看江小北说用的1.4.0的seata&#xff0c;但是图片中的目录文件都找不到&#xff0c;倒是在2.0.0的…

【git】:初识Git 和 Git 的安装

目录 学习 Git 的目标 Git 安装 Linux-centos Linux-ubuntu Windows 学习 Git 的目标 技术目标 掌握 Git 企业级应用&#xff0c;深刻理解Git操作过程与操作原理&#xff0c;理解工作区&#xff0c;暂存区&#xff0c;版本库的含义 掌握 Git 版本管理&#xff0c;自由进⾏…

DWG文件发布至IIS后无法下载和预览解决办法

问题描述 DWG文件发布至IIS后无法下载和预览 原因分析&#xff1a; iis里面需要添加扩展 解决方案&#xff1a; 在服务器端IS属性的HTTP头下的MIME内容中添加扩展名“.dwg” MIME类型填入application/acad

利用Python进行数据分析PDF下载经典数据分享推荐

本书由Python pandas项目创始人Wes McKinney亲笔撰写&#xff0c;详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python 3.6进行全面修订和更新&#xff0c;涵盖新版的pandas、NumPy、IPython和Jupyter&#xff0c;并增加大量实际案例…

【想心静?】红尘中修炼的功夫,才是真正的功夫

刘君亮想要去山中静坐&#xff0c;先生说&#xff1a; 你若是以厌弃身外事物的心去静中寻求天理&#xff0c;反而只会养出骄傲怠惰的习气。你若能不厌弃身外事物&#xff0c;然后再到静处涵养天理&#xff0c;却是好的。 去一个安静的地方&#xff0c;去沉静一下自己的内心也…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的&#xff1f; 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别&#xff1f; 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相…

kind kubernetes(k8s虚拟环境)使用本地docker的镜像

kubernetes中&#xff0c;虽然下载镜像使用docker&#xff0c;但是存储在docker image里的镜像是不能被k8s直接使用的&#xff0c;但是kind不同&#xff0c;可以使用下面的方法&#xff0c;让kind kubernetes环境使用docker image里的镜像。 kind – Quick Start 例如&#x…

Java数据结构-链表与LinkedList

链表 链表的概念 链表是一种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说&#xff0c;相比较于顺序表&#xff08;物理上连续&#xff0c;逻辑上也连续&#xff09;&#xff0c;链表物理上不一定连续。 链表是…

VBA语言専攻T3学员领取资料通知

T3学员领取资料通知0713 各位学员∶本周MF系列VBA技术资料增加646-650讲&#xff0c;T3学员看到通知后请免费领取,领取时间7月12日晚上19:00-7月13日晚上18:00。本次增加内容&#xff1a; MF646:OnKey禁用ShiftCTRL向右键 MF647:每隔一行插入一空行 MF648:取消合并单元格 …

druid(德鲁伊)数据线程池连接MySQL数据库

文章目录 1、druid连接MySQL2、编写JDBCUtils 工具类 1、druid连接MySQL 初学JDBC时&#xff0c;连接数据库是先建立连接&#xff0c;用完直接关闭。这就需要不断的创建和销毁连接&#xff0c;会消耗系统的资源。 借鉴线程池的思想&#xff0c;数据连接池就这么被设计出来了。…

pnpm9.5.0(catalog协议)

catalog(目录协议) 目录是工作区功能&#xff0c;用于将依赖版本范围定义为可重用常量&#xff0c;目录中定义的常量可以在package.json中使用&#xff0c; 结合 pnpm-workspace.yaml使用 定义pnpm-workspace.yaml packages&#xff1a;定义多仓库 packages:- packages/*cata…

docker(六)--创建镜像

六、创建镜像 1.创建镜像两种方式 方式1&#xff1a; 更新镜像 docker commit 方式2&#xff1a;构建镜像 docker build 2.更新镜像 1&#xff09;用法 docker commit -m“描述信息” -a作者 容器id或者容器名 镜像名:tag 2&#xff09;步骤 ①根据镜像运行容器 ②进入容…

飞睿智能无线高速uwb安全数据传输模块,低功耗、抗干扰超宽带uwb芯片传输速度技术新突破

在信息化的时代&#xff0c;数据传输的速度和安全性无疑是每个企业和个人都极为关注的话题。随着科技的飞速发展&#xff0c;超宽带&#xff08;Ultra-Wideband&#xff0c;简称UWB&#xff09;技术凭借其性能和广泛的应用前景&#xff0c;逐渐成为了数据传输领域的新星。今天&…

Android高级——Logger日志系统

Logger日志系统 Logger日志系统是基于内核中的Logger日志驱动程序实现将日志记录保存在内核空间中使用一个环形缓冲区来保存日志&#xff0c;满了之后&#xff0c;新的日志就会覆盖旧的日志 日志类型 main&#xff0c;记录应用程序级别system&#xff0c;记录系统级别radio&…

实验3-Spark基础-Spark的安装

文章目录 1. 下载安装 Scala1.1 下载 Scala 安装包1.2 基础环境准备1.3 安装 Scala 2. 下载安装 Spark2.1 下载 Spark 安装包2.2 安装 Spark2.3 配置 Spark2.4 创建配置文件 spark-env.sh 3. pyspark 启动4. 建立/user/spark文件夹 1. 下载安装 Scala 1.1 下载 Scala 安装包 下…