环境搭建 Spring Boot 2.x

Java JDK

需要安装 JDK java8 也就是 1.8, 用 jdk-8u271-windows-x64.exe 网上有很多安装java8的教程,很简单。我已经安装完了。注意配置环境变量。

C:\Users\Reciter>java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

Maven 的安装和配置

Maven3的压缩包 找同事要一个,解压到本地,记得设置环境变量。网上有很多教程,也不做介绍了。

$ mvn -v
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 23:22:22+0800)
Maven home: E:\myHome\epan\javaz\maven\maven3
Java version: 1.8.0_211, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_211\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"

记得添加 maven3的阿里镜像

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

IDEA 的安装

这个天天用,网上都有安装教程,就略过了。

配置 IDEA 的 Maven 环境

settings 搜 maven 在Build Tools下面有个Maven,将 Maven home directory 设置成 自己的maven目录。

Spring Boot 项目创建

创建项目

file - new - project...

选择 Spring Initializr 选择个 java web

注意java sdk 改成8

从新设置idea maven库的地址

创建完 就打开项目了,发现了一个问题,之前设置的maven 的库的地址是上个项目的,这个项目需要从新设置,要不maven的依赖库就会又从新下一遍,下载到 idea的maven库里。

端口 8080 冲突

\src\main\resources\application.yml 文件 配置

server:
port: 9443

项目启动成功

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.5) 2021-05-13 11:20:20.289 INFO 19688 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 1.8.0_211 on LAPTOP-LAD2S0RU with PID 19688 (C:\Users\Reciter\Desktop\springBootStudy2021\target\classes started by Reciter in C:\Users\Reciter\Desktop\springBootStudy2021)
2021-05-13 11:20:20.291 INFO 19688 --- [ main] com.example.demo.DemoApplication : The following profiles are active: prod
2021-05-13 11:20:20.778 INFO 19688 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9443 (http)
2021-05-13 11:20:20.783 INFO 19688 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-05-13 11:20:20.783 INFO 19688 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.45]
2021-05-13 11:20:20.835 INFO 19688 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-05-13 11:20:20.835 INFO 19688 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 511 ms
2021-05-13 11:20:20.932 INFO 19688 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-05-13 11:20:21.020 INFO 19688 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9443 (http) with context path ''
2021-05-13 11:20:21.026 INFO 19688 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 1.029 seconds (JVM running for 1.625)

访问 http://127.0.0.1:9443/

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu May 13 16:21:55 CST 2021
There was an unexpected error (type=Not Found, status=404).

这是java的404页面,还没有接口页面

创建 controller/HelloController

HelloController.class

package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class HelloController { @GetMapping("/hello")1. 1.
@ResponseBody
public String hello() {
return "hello,spring boot!";
}
}

访问: http://127.0.0.1:9443/hello

hello,spring boot!

SpringBoot 链接 mysql

思路整理:

  • pom.xml 相当于前台的 webpack.json 主要作用是 引用了哪些第三方库,一般库的存放就在maven里面,idea不设置,就会在自己的库里,每次新项目都要从新设置maven库。
  • application.properties 或者 application.yml 项目的属性配置文件,格式不一样,一个是 spring.datasource.username=root 另一个是 YAML 格式,就是tab 缩进,和python格式一样
  • Controller层 用于调用,可以调用 Service层 或 DAO层
  • DAO层,是个接口,用于定义都有哪些方法
  • Entity层,实体层,用于定义对象都有哪些属性或者说字段
  • Mapper层,补充DAO层,是个XML文件,里面是Sql语句
  • Service层 调用DAO层,或者它本身就是接口
  • Impl层 实现Service层接口
  • 调用链:pom.xml -> application.yml -> DemoApplication -> Controller层 -> Service层(可跳过)-> DAO(Mapper补充) -> Entity层

几个重点问题

  • pom.xml 添加 mybatis支持 添加3个 mybatis jdbc mysql

    • mybatis 数据的抽象类,通用类
    • jdbc 各种数据接口的大集合
    • mysql 是某一种数据的具体操作方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> <!-- 引入 MyBatis 场景启动器,包含其自动配置类及 MyBatis 3 相关依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
  • 添加 lombok 方便定义实体类
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
  • mysql数据库配置 放在 application.yml
spring:
datasource:
name: java-study-datasoure
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/javadbweb?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&useAffectedRows=true
username: root
password: 123456

绝对路径的概念

package com.example.demo;

每一个文件,都会有一个所谓位置的概念,对于每个项目的根来来说,它是有3个段落组成,然后由‘点’进行拼接,我这里的项目的根就是 com.example.demo,这里应该是为了网络上所有人发布包的根节点都不同,不会产生冲突,比如里面有公司名称,或者功能名称,项目名称等等,再进行拼接,就会得到一个绝对的根路径。然后所有的类在此根路径下,继续进行延展。

比如mapper文件就会对说明是附加到某个DAO上,这个时候,就会写上那个DAO的绝对路径。(不知道有没有相对路径概念)

文件目录

DemoApplication 分析



@SpringBootApplication 注解 说明是从这个类开始,也就是程序的起点

说下 import 这个关键字

import com.example.demo.service.HelloService === import HelloService from com.example.demo.service.HelloService

我这里有个小bug,就是我的实体类里面创建的JavaTest类,直接引用不好使,最后没办法,换成.*引用的了

HelloController 分析

  • @Controller 注解 说明当前类是 Controller层
  • @GetMapping 注解 说明当前方法是get方法,参数是访问的url
  • @ResponseBody 注解 说明return回去的内容是展示内容
  • @Autowired 注解是 自动装配,或者说动态注入,具体我还没分析,请自行找资料看。

JavaTestMapper 分析

  • @Mapper 注解 说明这个接口是mapper
  • 里面定义里一个 getJDBCValue 接口

HelloServiceImpl 分析

  • @Service 注解 说明是一个 Service层
  • implements 说明是继承的哪个接口 这里是继承的 HelloService接口
  • @Override 注解 说明是覆盖覆写某个函数方法

HelloService 分析

  • interface 说明当前是接口

很重要的mapper 分析

  • namespace 说明这个mapper 他在哪 他是谁的归属,写那个接口文件的绝对路径
  • id 说明这个函数的名称是什么
  • resultType 说明 返回的实体类型
  • select * from java_test 是sql语句

application.yml 解析

spring:
datasource:
name: java-study-datasoure
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/javadbweb?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&useAffectedRows=true
username: root
password: 123456
mybatis:
mapper-locations: classpath*:mapper/*.xml
server:
port: 9443
  • 这里注意 classpath是特指 resources 目录

pom.xml 没有解析,自己看吧

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> <!-- 引入 MyBatis 场景启动器,包含其自动配置类及 MyBatis 3 相关依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

接口调用 postman,可以跳过登录,先用

下一阶段目标,从新梳理上述知识点

注解 都是基于 接口

注解 到 到类,类就一定要实现一个接口,因为注解最后要找到对应接口

@Autowired 自动装配

@Autowired
BannerService bannerService;

两种自动装配

  • 接口 对应 有实现类,整好一个,就自动匹配,然后new完,注入回来
  • 接口 对应 mapper的xml,我的理解就是xml就是接口的实现,然后new完,注入回来

    总体上都省了一个new

    @Autowired 是SpringBoot架构里的

    @Resource 是Java架构里的。

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入

@RestController

  • @RestController = @Controller + @ResponseBody
  • @Controller 是说你是控制层 接收url的,可以是 get post 等等
  • @ResponseBody 是说 你方法里面 return 直接就返回到了接口层

@RequestMapping

@RequestMapping("${process.apiPath}/main/") 是告诉这个类 接收映射的基础url 应该都放在Controller层

@GetMapping

@GetMapping("getBanner") 是在方法上,告诉方法 接收的是get 地址是 基础url拼上这个字符串

ReturnMessage && ReturnFactory.success

@GetMapping("getBanner")
public ReturnMessage getBanner(){
List<BannerModel> bannerModelList = bannerService.getBannerMessage();
return ReturnFactory.success(bannerModelList);
}

ReturnMessage 就是返回的一个接口数据格式 有 data status msg

ReturnFactory.success 这个函数就是返回的 ReturnMessage 格式,将status=20 msg='ok' data=入参

接口 反射到 Impl实现类 Ctrl+T



点在函数名上,然后Ctrl+T 就跳转到 那个类实现了这个方法

MyBatis插件 接口反射到Mapper实现类

装个插件 叫 Free MyBatis plugin



安装完以后,左侧有箭头,点击进入xml的mapper,ctrl点击函数名,显示谁引入这个接口了。

Model的分析



这是另一种方案的Model,主要分析下这里的注解作用

@Data / lombok.Data

这里的 @Data 不等于 Spring Data,是两个东西。

看了好几圈,忽然反应过来,这个@Data是lombok的,作用的为了不写get set,省事用的。

  • @Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集

@Accessors / lombok.experimental.Accessors

Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果

chain的中文含义是链式的,设置为true,则setter方法返回当前对象。

@Data
@Accessors(chain = true)
public class User {
private Long id;
private String name; // 生成的setter方法如下,方法体略
public User setId(Long id) {}
public User setName(String name) {}
}

这个风格 用的话就是 u.id u.setId(1) setId返回的是对象

@NoArgsConstructor / lombok.NoArgsConstructor

@NoArgsConstructor : 生成一个无参数的构造方法

@AllArgsConstructor / lombok.AllArgsConstructor

添加一个构造函数,该构造函数含有所有已声明字段属性参数

@Table / javax.persistence.Table

@Table(name = "shop_center_pic") 声明此对象映射到数据库的数据表,通过它可以为实体指定表(Table)

@Column / javax.persistence.Column

@Column(name = "banner_pic") 注解 用来标识实体类中属性与数据表中字段的对应关系

@EqualsAndHashCode / lombok.EqualsAndHashCode

@EqualsAndHashCode(callSuper=false) 注解 附写 Equals 和 HashCode 这两个方法

话说 @Data注解里面 包含 @EqualsAndHashCode 注解了。

自己写个注解玩玩吗? 》 Annotation 注解快速入门

https://www.cnblogs.com/Qi1007/p/9768631.html

浅谈mybatis和jpa的区别

https://www.jianshu.com/p/32ce87c163d6

先有的 jpa(单表快) 后有的 mybatis (mapper)

两个都要学 都要会,jpa 和 mybatis 现在都有 代码生成器了。

挖坑 jsp 和 jpa 后期学

先把 mybatis 完成闭环后,再说,不能在最开始学的时候进行分散

Mapper Xml 位置更改到 Mapper接口的目录



pom.xml 文件里面 build下面加

<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>

application.yml里面的这个mapper-locations 没有用,开始一直以为有用了,耽误了一些时间

mybatis:
mapper-locations: classpath*:mapper/*.xml

@RequestParam get接参数

public List<OwnEntity> own (@RequestParam(required = true) String paramA) {
return ownService.getOwnList();
}

http://localhost:9443/own?paramA=1 可以进行调用,这里是必填参数

将参数传递到 mapper

参数paramA 先到 Controller层,然后 Service层,然后mapper 然后mapper.xml 然后 sql里面判断

  • 步骤一 Controller层

  • 步骤二 Service层

  • 步骤三 Service层impl实现

  • 步骤四 Mapper层

  • 步骤五 Mapper层的impl实现

mapper xml里面 可以加 属于mybatis

<if test="userType != null">
AND rep.user_type = #{userType}
</if>

mybatis官方中文文档 - 动态sql - 百度自行搜索

搜索接口 插件 restService

  • 正常搜接口,因为是拼装的字符串,所以直接全局搜索,是搜不到的
  • 当然,你也可以一个关键字,一个关键字的搜

参数的接收问题 重要!

  • 接收一个参数的过程需要4个步骤,如果参数是50个的话,那就得给自己写死了,还不算后期添加修改参数。
  • 解决方案1:将入参在Controller层,封装成Map
Map<String, Object> params = new HashMap<>(16);
params.put("youKeyName", "0");
  • 解决方案2:将入参传入一个实体类,这样就自动映射这个实体类了
@PostMapping("/saveOrUpdate")
public ReturnMessage saveOrUpdate(MyModel myModel) throws Exception {
  • 解决方案3:传入参数 和 实体类,两种一起用,最后再合并参数
params.putAll(yourModel.init())

新篇章

安装idea2019 之前2018和同事版本不一样

忽然发现,很多问题,版本2018和2019 不太一样,所以更新下2019

安装后,Maven问题

开始先改成了本地Maven库,但是有一些私有库,下不下来,因为自己的Maven3库,都是阿里源的,然后又改回了idea的maven库

有爆红的方法

等于是 全新的idea2019,所以lombok插件没有安装

又把常用的3个插件安装下:lombok、Free Mybatis plugin、Show REST Services 这三个plugins

RestfulToolkit 搜索Controller的插件

之前装的 Show REST Services 不好使,新装的这个好使。

最大端口为 65536

一个IP地址的端口可以有65536(2^16)个

添加 ReturnMessage类

这里是接口返回的数据格式

package com.example.demo.common.message;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; @Data
@NoArgsConstructor
@AllArgsConstructor
public class ReturnMessage{
private int status;
private Object data;
private String msg;
}

添加 ReturnFactory类

这里是用ReturnMessage类型返回对象

package com.example.demo.common.message;

public class ReturnFactory {
public static ReturnMessage success(Object data) {
return new ReturnMessage(200, data, "ok");
}
}

添加 good 接口

@GetMapping("/good")
@ResponseBody
public ReturnMessage good () {
// return ReturnFactory.success("chenggong");
Map<String, Object> k = new HashMap<>(16);
k.put("kkk","kkjjlj");
return ReturnFactory.success(k); }

接口动态获取参数,传什么,接什么

@GetMapping("/getMap")
@ResponseBody
public ReturnMessage getMap (@RequestParam(required = true) Map<String, String> Params) {
return ReturnFactory.success(Params);
}

待更新。。。

SpringBoot 学习记录 2021.05.13 Started的更多相关文章

  1. Springboot学习记录1--概念介绍以及环境搭建

    摘要:springboot学习记录,环境搭建: 官方文档地址:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/ht ...

  2. SpringBoot学习记录(二)

    一. SpringBoot日志框架 SpringBoot:底层是Spring框架,Spring框架默认是用JCL(commons-logging): SpringBoot选用SLF4j和logback ...

  3. SpringBoot——SpringBoot学习记录【一】

    前言 公司目前主要的业务,用的语言是java,所以学习下相关的技术呀,还好大学基础语言学的JAVA SpringBoot简介 官网 SpringBoot 简介 SpringBoot是用来简化Sprin ...

  4. SpringBoot学习记录(一)

    一.SpringBoot入门 1.SpringBoot简介 简化Spring应用开发的一个框架:整个Spring技术栈的一个大整合:J2EE开发的一站式解决方案: SpringBoot的优点: (1) ...

  5. SpringBoot学习记录(一)

    1. Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1. @Configuration 和 @Bean Spring的Java配置方式是 ...

  6. SpringBoot学习笔记(13):日志框架

    SpringBoot学习笔记(13):日志框架——SL4J 快速开始 说明 SpringBoot底层选用SLF4J和LogBack日志框架. SLF4J的使用 SpringBoot的底层依赖关系 1. ...

  7. Java学习记录:2022年1月13日(其二)

    Java学习记录:2022年1月13日(其二) ​ 摘要:本篇笔记主要记录了在设计类时的一些注意事项,类加载时类中各个部分的加载顺序以及继承和多态的知识. 目录 Java学习记录:2022年1月13日 ...

  8. Elasticsearch、XXLJob以及最近的学习记录

    Elasticsearch.XXLJob以及最近的学习记录 前言 在这九月的最后一周,来总结一下最近的学习记录,主要是对于Elasticsearch.XXLjob的初步学习,想着还是多记录点,以便后面 ...

  9. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  10. GIT初始学习记录

    目录 GIT学习记录 配置github与gitlib两个账号 基本操作 git init:初始化仓库 git status:查看仓库状态 git add :向缓存区中添加文件 git commit 保 ...

随机推荐

  1. C++ CryptoPP使用AES加解密

    Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...

  2. 使用C++实现Range序列生成器

    在C++编程中,经常需要迭代一系列数字或其他可迭代对象.通常,这需要编写复杂的循环结构,但有一种精妙的方法可以使这一过程变得更加简单和可读.如果你使用过Python语言那么一定对Range语句非常的数 ...

  3. 14.5 Socket 应用组播通信

    组播通信是一种基于UDP协议的网络通信方式,它允许发送方将消息同时传递给多个接收方.在组播通信中,发送方和接收方都会加入一个共同的组播组,这个组播组对应一个特定的IP地址,所有加入该组播组的主机都能够 ...

  4. Linux-nmon系统监控工具

    一.Nmon介绍 Nmon得名于 Nigel 的监控器,是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的,使用 Nmon 可以很轻松的监控系统的 CPU.内存.网 ...

  5. NC51111 Atlantis

    题目链接 题目 题目描述 There are several ancient Greek texts that contain descriptions of the fabled island At ...

  6. RFID EPC Class1 Gen2电子标签笔记

    RFID EPC Class1 Gen2 符合EPC Class1 Gen2(简称G2)协议V109版的电子标签(Tag)和读写器(Reader)应该具有下述的特性 标签存储器分区 Tag memor ...

  7. powerdesigner导出模型为RTF

    在设计模型的时候需要将设计好的模型进行尺寸调整并复制到word中.这时候就需要利用导出报告功能,导出为word格式. 再做进一步处理. 1.选择[报告]-[Generate Report] 2.自动打 ...

  8. Mysql错误消息 语言设置

    今天操作数据库的时候,mysql错误返回语句 ,一直报的是非英语的语言 ,百般纠结 ,简单的还大致能猜出意思 , 复杂了就会实在看不懂的 ,举个简单的如下: [Err] 1064 - Erreur d ...

  9. Jsp+Servlet实现文件上传下载(四)--下载文件

    接着上一篇讲: Jsp+Servlet实现文件上传下载(三)--删除上传文件    点击打开链接 本章来实现一下下载文件功能,同时优化了一下上一章中的代码. 废话少说,上代码 ------------ ...

  10. 无 dmp 文件的情况下使用 windbg

    项目线上出现了闪退问题,查看日志发现是 sentry 模块出问题了 因为用户电脑上没有 pdb 文件,所以无法加载具体函数的调用位置,只能手动去计算 具体步骤是:在 windbg.exe 中加载 se ...