APIJSON(三:demo主体代码)
2021SC@SDUSC
1.DemoApplication
首先映入眼帘的是一个static块
static {
APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() {
@Override
public SQLConfig createSQLConfig() {
return new DemoSQLConfig();
}
};
第二行的APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator()前面加上了static修饰。
此处调用的方法创建了一个新的APIJSONCreator的对象
以下是APIJSONCreator这个类中的所有元素——
public class APIJSONCreator implements ParserCreator<Long>, VerifierCreator<Long>, SQLCreator {
public APIJSONCreator() {
}
public Parser<Long> createParser() {
return new APIJSONParser();
}
public FunctionParser createFunctionParser() {
return new APIJSONFunctionParser();
}
public Verifier<Long> createVerifier() {
return new APIJSONVerifier();
}
public SQLConfig createSQLConfig() {
return new APIJSONSQLConfig();
}
public SQLExecutor createSQLExecutor() {
return new APIJSONSQLExecutor();
}
}
创建完对象后,又紧接着调用了(准确来说是重写了)里面的createSQLConfig()函数。
在该demo里面返回的是对应的DemoSQLConfig()类下的参数。
public class DemoSQLConfig extends APIJSONSQLConfig {
static {
DEFAULT_DATABASE = DATABASE_MYSQL; // TODO 默认数据库类型,改成你自己的
DEFAULT_SCHEMA = "apijson"; // TODO 默认模式名,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo, Oracle:
TABLE_KEY_MAP.put("User", "apijson_user");
TABLE_KEY_MAP.put("Privacy", "apijson_privacy");
}
@Override
public String getDBVersion() {
return "8.0.23"; // "8.0.11"; // TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 // MYSQL 8 和 7 使用的 JDBC 配置不一样
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBUri() {
return "jdbc:mysql://localhost:3306"; // TODO 改成你自己的,TiDB 可以当成 MySQL 使用,默认端口为 4000
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBAccount() {
return "root"; // TODO 改成你自己的
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBPassword() {
return "admin"; // TODO 改成你自己的,TiDB 可以当成 MySQL 使用, 默认密码为空字符串 ""
}
}
这个类主要记录了你数据库的相关参数,连接上数据库的凭依也就在这里。
之后就是该demo项目的主类了:
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
APIJSONApplication.init(false); // 4.4.0 以上需要这句来保证以上 static 代码块中给 DEFAULT_APIJSON_CREATOR 赋值会生效
}
SpringApplication.run是标准的springboot的启动类
run方法干了两件事:
- 创建SpringApplication对象;在对象初始化时保存事件监听器,容器初始化类以及判断是否为web应用,保存包含main方法的主配置类。
- 调用run方法;准备spring的上下文,完成容器的初始化,创建,加载等。会在不同的时机触发监听器的不同事件。
之后就是APIJSON的init方法——
public static void init(boolean shutdownWhenServerError) throws Exception {
init(shutdownWhenServerError, DEFAULT_APIJSON_CREATOR);
}
其中的init指向的是apijson的各种详细配置,这里先贴上一张图,详细分析在将来进行——
再之后是这么一段代码
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
首先是@Bean注解
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml
配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。
在这里他主要是对addCorsMappings进行了重写,这里的主要功能就是跨域——
之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。
咱们一行一行来看
registry.addMapping("/**") // 设置允许哪些可以进行跨域访问,设置为"*“表示允许所有
.allowedOriginsPatterns(”*") // 设置允许跨域请求的域名(allowedOrigins可用在不为*时)
.allowedMethods(“GET”, “POST”, “DELETE”, “PUT”) // 设置允许的方法
.allowCredentials(true) // 是否允许证书
.maxAge(3600); // 跨域允许时间
2.DemoController
首先是两个注解
@RestController
@RequestMapping("")
@RestController的作用等同于@Controller + @ResponseBody。
在一个类上添加@Controller注解,表明了这个类是一个控制器类。@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
而 @RequestMapping 则用来映射请求,也就是通过它来指定控制器可以处理哪些URL请求。
@PostMapping(value = "get")
@Override
public Parser<Long> newParser(HttpSession session, RequestMethod method) {
return super.newParser(session, method).setNeedVerify(false);
}
这里关闭校验,方便新手快速测试,而实际线上项目官方则是建议开启的
@RequestMapping("get/{request}")
public String openGet(@PathVariable String request, HttpSession session) {
try {
request = URLDecoder.decode(request, StringUtil.UTF_8);
} catch (Exception e) {
// Parser会报错
}
return get(request, session);
}
这里对请求作出的返回做接收