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输入格式: 输入在一行中给出一个整数,如&…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...