springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
文章目录
- 注入Servlet, Filter, Listener
- 官方文档
- 基本介绍
- 使用注解方式注入
- 使用RegistrationBean方法注入
- DispatcherServlet详解
- 内置Tomcat配置和切换
- 基本介绍
- 内置Tomcat配置
- 通过application.yml完成配置
- 通过类配置
- 切换Undertow
- 数据库操作
- Jdbc+HikariDataSource
- 需求分析
- 应用实例
- 整合Druid到SpringBoot
- 官方文档
- 基本介绍
- Druid基本使用
- Druid监控功能-SQL监控
- Druid监控功能-WEB关联监控
- Druid监控功能-SQL防火墙
- Druid监控功能-session监控
- Druid Spring Boot Starter
- 作业布置
注入Servlet, Filter, Listener
官方文档
spring-boot-reference.pdf


基本介绍
1.考虑到实际需求, SpringBoot 可以将 Servlet, Filter, Listener 注入 Spring 容器, 成为 SpringBean.
2.即 SpringBoot 开放了和原生 WEB 组件 (Servlet, Filter, Listener) 的兼容.
使用注解方式注入
1.创建src/main/java/com/zzw/springboot/servlet/Servlet_.java
/*** 1.通过继承 HttpServlet 开发原生的Servlet* 2.@WebServlet标识将 Servlet_ 对象/bean注入到容器* 3.(urlPatterns = {"/Servlet_"}) 对Servlet配置 url-pattern* 4.注入的原生的Servlet_, 不会被springboot的拦截器拦截*/
@WebServlet(urlPatterns = {"/Servlet_1", "/Servlet_2"})
public class Servlet_ extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("Servlet_");}
}
2.修改启动类 Application.java
//要求扫描com.zzw.springboot 包/及其子包下的原生方式注入的Servlet
@ServletComponentScan("com.zzw.springboot")
@SpringBootApplication
public class Application {public static void main(String[] args) {ApplicationContext ioc = SpringApplication.run(Application.class, args);}
}
3.测试 无需登录,不走拦截器
4.创建src/main/java/com/zzw/springboot/filter/Filter_.java
/*** 解读* 1.@WebFilter 表示Filter_ 是一个过滤器, 并注入容器* 2.urlPatterns = {"/css/*", "/images/*"} 当请求 /css/*目录的资源 或者 /images/*目录的资源 时, 会触发Filter_过滤器* 3.这里是直接放行后, 再经过拦截器, 拦截器是否拦截要根据拦截器的规则.*/
@Slf4j
@WebFilter(urlPatterns = {"css/*", "images/*"})
public class Filter_ implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("-- Filter init() --");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("-- Filter doFilter() --");HttpServletRequest request = (HttpServletRequest) servletRequest;log.info("过滤器处理的uri={}", request.getRequestURI());filterChain.doFilter(servletRequest, servletResponse);//放行}@Overridepublic void destroy() {log.info("-- Filter init() --");}
}
注意: 过滤器配置的urlPatterns也会经过SpringBoot拦截器. 为了看到效果, 请在拦截器配置中放行 /css/**.
在servlet中匹配路径全是 /*, 在SpringBoot中是 /**.
5.当前拦截器已经拦截 /css/*,当请求 localhost:8080/images/logo.png 时

由于拦截器不拦截 /images/**,所以当请求 localhost:8080/images/logo.png时,拦截器不会拦截
6.创建src/main/java/com/zzw/springboot/listener/Listener_.java
@Slf4j
@WebListener
public class Listener_ implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {log.info("contextInitialized 项目初始化 OK");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {log.info("contextInitialized 项目销毁 ");}
}
7.测试容器销毁
@ServletComponentScan("com.zzw.springboot")
@SpringBootApplication
public class Application {public static void main(String[] args) {ApplicationContext ioc = SpringApplication.run(Application.class, args);ioc.stop();//测试项目销毁}
}
使用RegistrationBean方法注入
前提: 取消原来的注解. @WebServlet, @WebFilter, @WebListener, @ServletComponentScan
1.创建src/main/java/com/zzw/springboot/config/RegisterConfig_.java
/*** 1.@Configuration 表示这是一个配置类* 2.Full(proxyBeanMethods = true): (默认)保证每个@Bean方法被调用多少次返回的组件都是单例的, 是代理方法*/
@Configuration(proxyBeanMethods = true)
public class RegisterConfig_ {//使用RegistrationBean方法注入Servlet@Beanpublic ServletRegistrationBean servlet_() {//创建原生的Servlet对象Servlet_ servlet = new Servlet_();//把servlet_对象关联到 ServletRegistrationBean对象//"/Servlet_1", "/Servlet_2" 就是注入的Servlet 的 url-patternsreturn new ServletRegistrationBean(servlet, "/Servlet_1", "/Servlet_2");}//使用RegistrationBean方法注入Filter@Beanpublic FilterRegistrationBean filter_() {//创建原生的Filter对象Filter_ filter = new Filter_();FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);//设置filter的url-patternsfilterRegistrationBean.setUrlPatterns(Arrays.asList("/css/*", "/images/logo.png"));return filterRegistrationBean;}//使用RegistrationBean方法注入Listener@Beanpublic ServletListenerRegistrationBean listener_() {//创建原生的Listener对象Listener_ listener = new Listener_();return new ServletListenerRegistrationBean(listener);}
}
2.证明 ServletRegistrationBean 和 原生Servlet_ 对象的关系.


3.测试
DispatcherServlet详解
1.请求Servlet时,不会到达DispatcherServlet,因此也不会到达拦截器。
2.原因分析
注入的Servlet会存在于Spring容器;DispatcherServlet也会存在于Spring容器。

3.会议Tomcat在对Servlet url匹配的原则,多个servlet都能处理到同一层路径,精确优先原则/最长前缀匹配原则。
4.看看spring容器的debug图

5.在SpringBoot中,调用@Controller目标方法 是按照DispatcherServlet分发匹配的机制, 回顾一下SpringMVC底层机制。
6.源码分析
1)DispatcherServlet在SpringBoot是如何配置和注入的?
DispatcherServletAutoConfiguration完成对DispatcherServlet自动配置。




内置Tomcat配置和切换
基本介绍
1.SpringBoot支持的webServer:Tomcat,Jetty,Undertow。


2.SpringBoot应用启动是Web应用时, web场景包-导入tomcat。
3.支持对Tomcat(也可以是Jetty,Undertow)的配置和切换。
内置Tomcat配置
通过application.yml完成配置
参考 ServerProperties.java, 查看源码得知有哪些属性配置. 有很多内部类.


2.通过application.yml完成配置
server:#配置端口port: 8084tomcat: #tomat是ServerProperties的静态内部类,对tomcat配置threads:max: 10 #max是threads静态内部类的属性,默认是200min-spare: 5 #Minimum amount of worker threads. 默认是10accept-count: 200 #当tomcat启动的线程达到最大值后,接受排队的请求个数,默认是100max-connections: 2000 #最大 连接数/并发数connection-timeout: 10000 #建立连接的超时时间,单位是毫秒# tomcat还有其它的配置...
通过类配置
1.通过类配置Tomcat (提示: 配置文件可以配置的更全)
2.创建src/main/java/com/zzw/springboot/config/CustomizationBean.java
//通过类配置Tomcat
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {@Overridepublic void customize(ConfigurableServletWebServerFactory server) {//手动修改的server.setPort(9092);//设置server的端口 9092}
}
3.注销application.yml配置
#配置端口
# port: 8084
# tomcat: #tomat是ServerProperties的静态内部类,对tomcat配置
# threads:
# max: 10 #max是threads静态内部类的属性,默认是200
# min-spare: 5 #Minimum amount of worker threads. 默认是10
# accept-count: 200 #当tomcat启动的线程达到最大值后,接受排队的请求个数,默认是100
# max-connections: 2000 #最大 连接数/并发数
# connection-timeout: 10000 #建立连接的超时时间,单位是毫秒# tomcat还有其它的配置...
4.启动Tomcat
2024-11-07 21:47:33.830 INFO 24888 — [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path ‘’
切换Undertow
1.修改pom.xml, 排除tomcat, 加入Undertow依赖
<!--导入web项目场景启动器, 会自动地导入和web开发相关的所有依赖[库/jar]-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--排除tomcat server--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency><!--引入Undertow-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency>
2.排除Tomcat后,由于无法引入servlet, 会报错。再次引入undertow之后,就好了。

3.测试

数据库操作
Jdbc+HikariDataSource
需求分析
需求:演示SpringBoot如何通过jdbc+HikariDataSource 完成对Mysql操作。
说明:HikariDataSource:目前市面上非常优秀的数据源,是SpringBoot2默认数据源。
应用实例
1.sql
`furn_ssm`-- 创建 furn_ssm
DROP DATABASE IF EXISTS spring_boot;
CREATE DATABASE spring_boot;
USE spring_boot;-- 创建家居表
CREATE TABLE furn(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id
`name` VARCHAR(64) NOT NULL DEFAULT '', ## 家居名
`maker` VARCHAR(64) NOT NULL DEFAULT '', ## 厂商
`price` DECIMAL(11,2) NOT NULL DEFAULT 0, ## 价格
`sales` INT(11) NOT NULL DEFAULT 0, ## 销量
`stock` INT(11) NOT NULL DEFAULT 0, ## 库存
`img_path` VARCHAR(255) NOT NULL # 图片路径
);SELECT f1.`name` FROM furn f1 LEFT JOIN furn f2 ON f1.id = f2.id WHERE f1.price=123
-- 添加数据
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '北欧风格小桌子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '简约风格小椅子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '典雅风格小台灯' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '温馨风格盆景架' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg');-- 查询
SELECT * FROM furn;-- 删除
DROP TABLE furn;
2.进行数据库开发,在pom.xml引入data-jdbc-starter. 参考离线文档 spring-boot-reference.pdf

<!--进行数据库开发,引入data-jdbc starter-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

3.需要在pom.xml指定导入数据库驱动, 并指定对应版本.
<!--引入mysql驱动
1.说明: 我们这里没有使用版本仲裁 <mysql.version>8.0.26</mysql.version>
2.我们指定版本 <version>5.1.49</version>
-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
</dependency>
4.application.xml配置数据源信息
xml文件里使用&防止出现乱码, 在yaml里直接使用&
spring:datasource:# 如果没有指定useSSL=true, 启动项目会报红(不好看), 但能正常运行url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: zzwdriver-class-name: com.mysql.jdbc.Driver
5.新建src/main/java/com/zzw/springboot/bean/Furn.java
public class Furn {private Integer id;private String name;private String business;private BigDecimal price;private Integer saleNum;private Integer inventory;private String imagePath;}
6.测试E:\idea_project\zzw_springboot\springboot-usersys\src\test\java\com\zzw\springboot\ApplicationTest.java
<!--如何在SpringBoot中开发测试类, 需要引入starter-test-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency>
//演示一下如何在SpringBoot中开发测试类
@SpringBootTest
public class ApplicationTest {//自动注入JdbcTemplate对象@Resourceprivate JdbcTemplate jdbcTemplate;@Testpublic void contextLoads() {//准备参数String sql = "select * from `furn`";BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);//调用List<Furn> furnList = jdbcTemplate.query(sql, rowMapper);//输出for (Furn furn : furnList) {System.out.println(furn);}//查看底层使用的是什么数据源类型[HikariDataSource]System.out.println(jdbcTemplate.getDataSource());}
}
整合Druid到SpringBoot
官方文档
使用手册: https://github.com/alibaba/druid
中文手册: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
基本介绍
1.HiKariCP: 目前市面上非常优秀的数据源, 是SpringBoot2默认数据源.
2.Druid: 性能优秀, Druid提供性能卓越的连接池功能外(java基础), 还集成了SQL监控, 黑名单拦截功能. 通过Druid提供的监控功能, 可以清楚地知道连接池和SQL的工作情况及SQL的执行时间. 所以根据项目的需要, 我们需要掌握Druid和SpringBoot的整合.
3.Druid和SpringBoot的整合方式.
自定义方式;
引入starter方式.
Druid基本使用
需求:将SpringBoot的数据源切换成Druid。
代码实现
1.修改pom.xml, 引入druid依赖
<!--引入druid依赖-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.17</version>
</dependency>
2.创建src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidDataSourceConfig {private String url;private String username;private String password;private String driverClassName;//编写方法,注入DruidDataSource@Beanpublic DruidDataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);druidDataSource.setDriverClassName(driverClassName);return druidDataSource;}
}
或者
@Configuration
public class DruidDataSourceConfig {//编写方法,注入DruidDataSource//疑问: 为什么我们注入自己的DataSource, 默认的HikariDataSource失效了?//1.默认的数据源是如何配置的?//解读: 通过@ConditionalOnMissingBean({ DataSource.class, XADataSource.class }), 判断如果容器有 DataSource Bean// 就不注入默认的HikariDataSource//2.debug源码@ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DruidDataSource druidDataSource() {//1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yml的配置//2.我们就不需要显示地调用DruidDataSource 对象的 setXxx, 会自动关联调用DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}
}

Druid监控功能-SQL监控
需求:配置Druid的监控功能,包括SQL监控,SQL防火墙,Web应用,Session监控等。 [参考官方文档]
1.修改src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java, 增加druid的监控功能.
//配置druid监控页功能
@Bean
public ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(statViewServlet, "druid/*");Map<String, String> initParameters = new HashMap<>();initParameters.put("loginUsername", "druid");//允许清空统计数据initParameters.put("loginPassword", "druid");//用户名initParameters.put("resetEnable", "true");//密码servletRegistrationBean.setInitParameters(initParameters);return servletRegistrationBean;
}


3.修改src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java/druidDataSource(),加入SQL监控

//加入监控功能
druidDataSource.setFilters("stat");
4.增加src/main/java/com/zzw/springboot/controller/DruidSqlController.java, 模拟操作DB请求
@Controller
public class DruidSqlController {@Resourceprivate JdbcTemplate jdbcTemplate;@ResponseBody@GetMapping("sql")public List<Furn> getData() {String sql = "select * from furn";BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);List<Furn> furnList = jdbcTemplate.query(sql, rowMapper);return furnList;}
}
5.测试 Druid连接池介绍


Druid监控功能-WEB关联监控
需求: 配置Web关联监控配置, 包括Web应用, URI监控. [参考官方文档]

1.修改src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java/druidDataSource(),加入WEB监控
//WebStatFilter用于采集web-jdbc关联监控的数据。
@Bean
public FilterRegistrationBean webStatFilter() {WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));Map<String, String> initParameters = new HashMap<>();initParameters.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");filterRegistrationBean.setInitParameters(initParameters);return filterRegistrationBean;
}
2.测试

Druid监控功能-SQL防火墙
需求: 配置SQL防火墙 [参考官方文档]

1.修改src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java/druidDataSource(),加入SQL防火墙
//加入监控功能, 加入SQL防火墙
druidDataSource.setFilters("stat,wall");
2.测试

Druid监控功能-session监控
需求: 配置session监控 [参考官方文档]
1.不用配置,要登录用户系统,才能看到session监控信息

Druid Spring Boot Starter
✅基本介绍
1.前面我们使用的是自己引入druid+配置类方式整合Druid和监控。
2.Druid Spring Boot Start 可以让程序员在Spring Boot项目中更加轻松集成Druid和监控。
✅应用案例
需求:使用Druid Spring Boot Starter 方式完成Druid集成和监控。[参考官方文档]
1.修改pom.xml, 注销druid的依赖
2.注销src/main/java/com/zzw/springboot/config/DruidDataSourceConfig.java全部
3.测试,可见已经恢复到原状

4.在 Spring Boot 项目中加入druid-spring-boot-starter依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version>
</dependency>
5.添加配置
#配置druid和监控功能
druid:stat-view-servlet: #配置druid和监控功能enabled: truelogin-username: zhaozhiweilogin-password: 123456reset-enable: falseweb-stat-filter: # 配置Web关联监控配置enabled: trueurl-pattern: /*exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'filter: #sql监控stat:slow-sql-millis: 1000 #指定慢查询的时间log-slow-sql: trueenabled: true #超过这个时间就记录在sql监控的页面里wall: #配置sql防火墙enabled: true #启用sql防火墙(不在白名单那就在黑名单,看你的拦截规则)drop-table-allowed: false #禁止删除表config:select-all-column-allow: false #禁止select *, 如果有,加入sql黑名单
6.测试

作业布置
1.把我们前面学过的异常处理,注入Servlet Fileter Listener,Tomcat切换,数据库操作(HiKariDataSource 和 DruidDataSource), 相关代码和案例,自己写一遍。
2.目前是一些比较散的知识点,同学们学习时,如果想不起来,一定要回顾在前面那个章节中讲过,做一个简单快速的巩固,从而达到融会贯通。
相关文章:
springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…...
力扣-贪心-53 最大子数组和
思路 先把每一个值都加到当前集合中,记录当前的和,直到当前记录和小于0了,再重置改记录,再次尝试累加 代码 class Solution { public:int maxSubArray(vector<int>& nums) {int res INT32_MIN;int curSum 0;for(in…...
吃一堑长一智
工作中经历,有感触记录下 故事一 以前在一家公司时,自己是一名开发人员,遇到问题请教领导解决方案,当时领导给了建议,后来上线后出问题了,背了锅。心里想的是领导说这样做的呀,为什么出问题还…...
aws(学习笔记第二十九课) aws cloudfront hands on
aws(学习笔记第二十九课) 使用aws cloudfront 学习内容: 什么是aws cloudfront练习使用aws cloudfront 1. 什么是aws cloudfront aws cloudfront的整体架构 这里可以看出,aws引入了edge location的概念,用户的client与edge location进行是…...
deepseek自动化代码生成
使用流程 效果第一步:注册生成各种大模型的API第二步:注册成功后生成API第三步:下载vscode在vscode中下载agent,这里推荐使用cline 第四步:安装完成后,设置模型信息第一步选择API provider: Ope…...
【C++八股】内存对⻬
内存对齐是指编译器按照特定规则安排数据在内存中的存储位置,以提高程序的执行效率和可移植性。 内存对齐的原因: 1. 性能优化: 现代处理器通常要求数据在内存中按照特定的边界对齐,以提高内存访问效率。 如果数据未对齐&#x…...
idea连接gitee后.反向创建仓库和分支
文章目录 自动关联你登录的账号填写你的仓库和分支完成后会在gitee上创建一个仓库 (使用idea远程兼容gitee并反向创建仓库和分支) 自动关联你登录的账号 填写你的仓库和分支 完成后会在gitee上创建一个仓库...
汽车自动驾驶辅助L2++是什么?
自动驾驶辅助级别有哪些? 依照SAE(SAE International,Society of Automotive Engineers国际自动机工程师学会)的标准,大致划分为6级(L0-L5): L0人工驾驶:即没有驾驶辅助…...
围棋打谱应用软件设计制作
围棋打谱应用软件设计制作 五子棋游戏是大家耳熟能详的游戏,深受大众喜爱。可见其在智能游戏中的地位。我在本站发了好几篇文章介绍编制方法和算法。而类似的围棋游戏则是智能游戏的顶级存在。今在此基础上编制一款围棋打谱软件。当然这是简单的游戏程序࿰…...
论文笔记-WSDM2025-ColdLLM
论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM:用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…...
线代[8]|北大丘维声教授《怎样学习线性代数?》(红色字体为博主注释)
文章目录 说明一、线性代数的内容简介二、学习线性代数的用处三、线性代数的特点四、学习线性代数的方法五、更新时间记录 说明 文章中红色字体为博主敲录完丘教授这篇文章后所加,刷到这篇文章的读者在首次阅读应当跳过红色字体,先通读一读文章全文&…...
使用 C++ 和 gRPC 的常见陷阱及解决方案
文章目录 1. 环境配置的陷阱1.1 依赖版本冲突或混淆1.2 gRPC 工具缺失 2. 编译和链接的陷阱2.1 运行时库不匹配(/MT vs /MD)2.2 未解析的外部符号 3. Protobuf 文件生成的陷阱3.1 工具版本不匹配3.2 生成文件运行时库不一致 4. 运行时的陷阱4.1 缺少 DLL…...
《深度学习实战》第2集:卷积神经网络(CNN)与图像分类
《深度学习实战》第2集:卷积神经网络(CNN)与图像分类 引言 卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer…...
AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南
目录 1、立创商城下载原理图和PCB图 1.1 打开立创商城 1.2 寻找所需器件 1.3 确定所需芯片 1.4 打开原理图和PCB图 1.5 导出原理图 1.6 确定导出为AD文件 1.7 下载成功 1.8 导出PCB 1.9 确定导出为AD文件 1.10 原理图PCB下载成功 2、原理图和PCB图预处理 2.1 复制…...
DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析
调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...
LangChain系列:精通LangChain的合并文档链
LangChain的合并链旨在解决语言模型处理长文本时的上下文限制问题,包含Stuff、MapReduce、Refine和Rerank四种策略。Stuff链通过简单拼接文档块实现快速处理,适用于短文本但受限于模型token容量;MapReduce链采用分治思想,先独立处…...
rtcwake - Linux下定时唤醒计算机
rtcwake 是一个用于通过实时时钟(RTC)唤醒计算机的工具。它常用于在 Linux 系统中设置计算机在指定时间自动唤醒或关闭。以下是对命令 rtcwake -m off -s ${sleep_time} 的详细解析: 命令解析 bash复制 rtcwake -m off -s ${sleep_time} 1…...
MATLAB在投资组合优化中的应用:从基础理论到实践
引言 投资组合优化是现代金融理论中的核心问题之一,旨在通过合理配置资产,实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱,成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…...
什么是“可迭代”
在 Python 中,“可迭代”(Iterable)是一个非常重要的概念,它指的是任何可以被逐个访问其元素的对象。换句话说,如果一个对象支持迭代操作(比如可以通过 for 循环逐个访问其元素),那么…...
Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和
007-念数字 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式: 输入在一行中给出一个整数,如&…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
