APIJSON(三:demo主体代码)

APIJSON(三:demo主体代码)


2021SC@SDUSC

1.DemoApplication

首先映入眼帘的是一个static块

static {
    
    
   APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() {
    
    
      @Override
      public SQLConfig createSQLConfig() {
    
    
         return new DemoSQLConfig();
      }
   };

static{}静态代码块与{}普通代码块之间的区别

第二行的APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator()前面加上了static修饰。

此处调用的方法创建了一个新的APIJSONCreator的对象

image-20211013145111985

以下是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方法干了两件事:

  1. 创建SpringApplication对象;在对象初始化时保存事件监听器,容器初始化类以及判断是否为web应用,保存包含main方法的主配置类。
  2. 调用run方法;准备spring的上下文,完成容器的初始化,创建,加载等。会在不同的时机触发监听器的不同事件。

之后就是APIJSON的init方法——

public static void init(boolean shutdownWhenServerError) throws Exception {
    
    
    init(shutdownWhenServerError, DEFAULT_APIJSON_CREATOR);
}

其中的init指向的是apijson的各种详细配置,这里先贴上一张图,详细分析在将来进行——

image-20211013165857894

再之后是这么一段代码

@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);
}

这里对请求作出的返回做接收

猜你喜欢

转载自blog.csdn.net/qq_50861917/article/details/120751630