@zhongdao
2022-02-24T13:12:18.000000Z
字数 5085
阅读 1048
未分类
http://c.biancheng.net/spring/spring-abc.html
Spring 框架是一个分层的、面向切面的 Java 应用程序的一站式轻量级解决方案,它是 Spring 技术栈的核心和基础,是为了解决企业级应用开发的复杂性而创建的。
在实际开发中,服务器端应用程序通常采用三层体系架构,分别为表现层(web)、业务逻辑层(service)、持久层(dao)。
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。
Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
在传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new Object() 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。为了方便理解和描述,我们可以将前者称为“调用者”,将后者称为“被调用者”。也就是说,调用者掌握着被调用者对象创建的控制权。
但在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里的,其大致步骤如下。
1. 开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 标签、在 Java 类上使用 @Component 注解等。
2. Spring 启动时,IoC 容器会自动根据对象定义,将这些对象创建并管理起来。这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
3. 当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不需要手动通过代码(例如 new Obejct() 的方式)创建。
IoC 带来的最大改变不是代码层面的,而是从思想层面上发生了“主从换位”的改变。原本调用者是主动的一方,它想要使用什么资源就会主动出击,自己创建;但在 Spring 应用中,IoC 容器掌握着主动权,调用者则变成了被动的一方,被动的等待 IoC 容器创建它所需要的对象(Bean)。
这个过程在职责层面发生了控制权的反转,把原本调用者通过代码实现的对象的创建,反转给 IoC 容器来帮忙实现,因此我们将这个过程称为 Spring 的“控制反转”。
控制反转核心思想就是由 Spring 负责对象的创建。在对象创建过程中,Spring 会自动根据依赖关系,将它依赖的对象注入到当前对象中,这就是所谓的“依赖注入”。
在 Java 软件开发过程中,系统中的各个对象之间、各个模块之间、软件系统和硬件系统之间,或多或少都存在一定的耦合关系。
若一个系统的耦合度过高,那么就会造成难以维护的问题,但完全没有耦合的代码几乎无法完成任何工作,这是由于几乎所有的功能都需要代码之间相互协作、相互依赖才能完成。因此我们在程序设计时,所秉承的思想一般都是在不影响系统功能的前提下,最大限度的降低耦合度。
IoC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下。
在配置文件(例如 Bean.xml)中,对各个对象以及它们之间的依赖关系进行配置;
我们可以把 IoC 容器当做一个工厂,这个工厂的产品就是 Spring Bean;
容器启动时会加载并解析这些配置文件,得到对象的基本信息以及它们之间的依赖关系;
IoC 利用 Java 的反射机制,根据类名生成相应的对象(即 Spring Bean),并根据依赖关系将这个对象注入到依赖它的对象中。
由于对象的基本信息、对象之间的依赖关系都是在配置文件中定义的,并没有在代码中紧密耦合,因此即使对象发生改变,我们也只需要在配置文件中进行修改即可,而无须对 Java 代码进行修改,这就是 Spring IoC 实现解耦的原理。
IoC 思想基于 IoC 容器实现的,IoC 容器底层其实就是一个 Bean 工厂。Spring 框架为我们提供了两种不同类型 IoC 容器,它们分别是 BeanFactory 和 ApplicationContext。
BeanFactory 是 IoC 容器的基本实现,也是 Spring 提供的最简单的 IoC 容器,它提供了 IoC 容器最基本的功能,由 org.springframework.beans.factory.BeanFactory 接口定义。
public static void main(String[] args) {
BeanFactory context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = context.getBean("helloWorld", HelloWorld.class);
obj.getMessage();
}
ApplicationContext 是 BeanFactory 接口的子接口,是对 BeanFactory 的扩展。ApplicationContext 在 BeanFactory 的基础上增加了许多企业级的功能,例如 AOP(面向切面编程)、国际化、事务支持等。
ApplicationContext 接口有两个常用的实现类,
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
public static void main(String[] args) {
//使用 FileSystemXmlApplicationContext 加载指定路径下的配置文件 Bean.xml
BeanFactory context = new FileSystemXmlApplicationContext("D:\\eclipe workspace\\spring workspace\\HelloSpring\\src\\Beans.xml");
HelloWorld obj = context.getBean("helloWorld", HelloWorld.class);
obj.getMessage();
}
由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建。
我们可以把 Spring IoC 容器看作是一个大工厂,Bean 相当于工厂的产品。如果希望这个大工厂生产和管理 Bean,就需要告诉容器需要哪些 Bean,以哪种方式装配。
Spring 配置文件支持两种格式,即 XML 文件格式和 Properties 文件格式。
Properties 配置文件主要以 key-value 键值对的形式存在,只能赋值,不能进行其他操作,适用于简单的属性配置。
XML 配置文件采用树形结构,结构清晰,相较于 Properties 文件更加灵活。但是 XML 配置比较繁琐,适用于大型的复杂的项目。
通常情况下,Spring 的配置文件都是使用 XML 格式的。XML 配置文件的根元素是 ,该元素包含了多个子元素 。每一个 元素都定义了一个 Bean,并描述了该 Bean 是如何被装配到 Spring 容器中的。
页面:
设备管理
csr校验
厂商报文
未识别厂商报文
cd /root/src/ttip-front-end
npm install
npm install axios
npm install @mui/material
npm install @mui/x-data-grid
npm install react-cookies
npm install md5
sudo apt install xsel
npm run build
npm install -g serve
serve -s build
The last command shown above will serve your static site on the port 3000
执行
sqlite3 test.db
id: 1234 ,
password: 1234
vendor_id: 1234
insert into vendor(id,password,vendor_id,vendor_name) values(1234,"e7df7cd2ca07f4f1ab415d457a6e1c13","1234","test_vendor_name");
.read ./test.sql
.schema
CREATE TABLE device (device_id varchar(255) not null, licence varchar(255), vendor_id varchar(255), primary key (device_id));
CREATE TABLE hibernate_sequence (next_val bigint);
CREATE TABLE kdmresponse (id integer not null, kdm varchar(255), code varchar(255), device_id varchar(255), msg varchar(255), show_id varchar(255), signature varchar(255), status varchar(255), time_stamp varchar(255), primary key (id));
CREATE TABLE movie (id varchar(255) not null, dcp varchar(255), kdm varchar(255), primary key (id));
CREATE TABLE register_response (id integer not null, code integer not null, csr varchar(255), device_id varchar(255), license varchar(255), msg varchar(255), state integer not null, vendor_id varchar(255), primary key (id));
CREATE TABLE unknown_msg (id integer not null, deviceipaddress varchar(255), mac varchar(255), msgtype varchar(255), processresult varchar(255), requestmsg varchar(255), requestmsgparsed varchar(255), timestamp varchar(255), primary key (id));
CREATE TABLE vendor (id integer not null, password varchar(255), vendor_id varchar(255), vendor_name varchar(255), primary key (id));
CREATE TABLE vendor_msg (id integer not null, deviceid varchar(255), deviceipaddress varchar(255), mac varchar(255), msgtype varchar(255), processresult varchar(255), requestmsg varchar(255), requestmsgparsed varchar(255), responsemsg varchar(255), responsemsgparsed varchar(255), timestamp varchar(255), vendorid varchar(255), primary key (id));
sqlite> .databases
main: /root/src/ttip-back-end/test.db
.tables
device kdmresponse register_response vendor
hibernate_sequence movie unknown_msg vendor_msg
每个日志有个id,
终端日志的设置
格式、
传输机制
服务平台的处理
验签:验证日志来自特定终端
一条链
不滚着签
对内容签