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输入格式: 输入在一行中给出一个整数,如&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
