固定思路详解

Springboot

Springboot的依赖为什么可以不写版本号

在父版本进入之后在进入父版本所依赖的父版本之后,发现里面写好了我们以后可能依赖的依赖的版本号,已经固定写好了,这里管理者所有依赖的版本,导入依赖之后不写版本就用这里的版本,有个版本号仲裁中心。

Springboot是怎么扫包的?

在SpringApplication.run方法中传入了启动类的字节文件,还有参数,这里通过反射获得了启动类的注解@SpringBootApplication,而这个注解里面自动的功能,比如包扫描和自动装载。

而里面有个@EnableAutoConfiguration 就实现了自动包扫描,会获得包名然后,开始扫描。所以启动类必须覆盖所有与业务相关的类:启动类所在的包必须是业务类所在包的同包或者父包。如果没有覆盖,业务类就不会自动装配到IoC容器中。

Springboot如何配置呢?

有一些默认的配置已经写好了都放在了所依赖的父项目中的仲裁中心里面,而springboot是在@SpringBootConfiguration里面有个@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
给容器中导入一些组件的选择器

这些自动配置类给我们当前项目的场景提供了一些组件和配置,有了自动配置就免除类手动编写配置文件,注入等等功能

什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

实现RMI程序步骤

1、创建一个远程接口,继承java.rmi.Remote接口

2、实现远程接口,并继承UnicastRemoteObject

3、创建服务器程序,同时使用createRegistry方法注册远程接口对象

4、创建客户端程序,通过Naming类的lookup方法来远程调用接口中的方法

序列化和反序列化

(1)Java序列化就是指把Java对象转换为字节序列的过程

    Java反序列化就是指把字节序列恢复为Java对象的过程。

(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

   反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

序列化优点:

①将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。

②序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。

③通过序列化可以在进程间传递对象。

序列化和反序列化代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
FileOutputStream fos = new FileOutputStream("object.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student student1 = new Student("lihao", "wjwlh", "21");
oos.writeObject(student1);
oos.flush();
oos.close();
//反序列化
FileInputStream fis = new FileInputStream("object.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Student student2 = (Student) ois.readObject();
System.out.println(student2.getUserName()+ " " +
student2.getPassword() + " " + student2.getYear());
}

}

在一个springboot项目中,我们将pojo类实现了序列化接口提供了序列化id,那么我们反序列化的过程是在哪里实现的,在写代码的过程中并没有显示的方式进行反序列化

在Spring Boot项目中,POJO类实现 Serializable 接口并提供序列化ID的主要目的是为了支持对象的序列化和反序列化操作。序列化是将对象的状态转换为字节流的过程,而反序列化则是将字节流恢复为对象的过程。

虽然你在代码中可能没有显式地编写反序列化的逻辑,但实际上,反序列化的实现是由Java的标准库(如 ObjectInputStream)或某些框架(如Spring、Hibernate等)自动完成的。以下是反序列化可能发生的场景和实现方式:


1. Java标准库中的反序列化

如果你使用了Java的序列化机制(ObjectOutputStreamObjectInputStream),反序列化通常是通过以下代码实现的:

1
2
3
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser"));
MyPojo pojo = (MyPojo) ois.readObject();
ois.close();

在这里,readObject() 方法会从文件中读取字节流,并将其反序列化为一个对象。你不需要手动处理对象的字段赋值,Java会根据字节流自动还原对象的状态。


2. Spring MVC 中的反序列化

在Spring Boot项目中,如果你使用了Spring MVC来处理HTTP请求,反序列化通常发生在以下场景:

a. JSON 数据反序列化

当你通过 @RequestBody 注解接收JSON格式的数据时,Spring会使用 HttpMessageConverter(例如 MappingJackson2HttpMessageConverter)将JSON字符串反序列化为Java对象。

1
2
3
4
5
@PostMapping("/example")
public ResponseEntity<String> example(@RequestBody MyPojo pojo) {
// Spring 自动将 JSON 反序列化为 MyPojo 对象
return ResponseEntity.ok("Success");
}

在这个例子中,Spring会在后台调用 Jackson 库将JSON字符串解析为 MyPojo 对象。这个过程对开发者来说是透明的。

b. 表单数据反序列化

如果你通过表单提交数据,Spring也会根据表单字段的名称自动将数据绑定到对应的POJO对象上。

1
2
3
4
5
@PostMapping("/form")
public ResponseEntity<String> formExample(MyPojo pojo) {
// Spring 自动将表单数据绑定到 MyPojo 对象
return ResponseEntity.ok("Success");
}

这种情况下,Spring 使用的是 ModelAttributeMethodProcessor 来完成数据绑定。


3. 缓存框架中的反序列化

如果你使用了缓存框架(如 Redis、Ehcache 等),对象可能会被序列化存储到缓存中。当从缓存中读取数据时,缓存框架会自动进行反序列化。

例如,在使用 Redis 时:

1
2
3
4
5
// 存入缓存
redisTemplate.opsForValue().set("key", myPojo);

// 从缓存中读取
MyPojo pojo = redisTemplate.opsForValue().get("key");

这里,redisTemplate 会根据配置的序列化器(如 JdkSerializationRedisSerializerJackson2JsonRedisSerializer)自动完成反序列化。


4. ORM 框架中的反序列化

如果你使用了ORM框架(如 Hibernate、JPA),当从数据库中读取数据时,框架会将数据库记录映射为实体对象。这本质上也是一种反序列化过程。

例如:

1
MyEntity entity = entityManager.find(MyEntity.class, id);

在这个过程中,Hibernate 会根据数据库记录自动创建 MyEntity 对象。


5. 其他场景

除了上述常见场景外,反序列化还可能发生在以下情况:

  • 消息队列:如 RabbitMQ、Kafka 等消息队列中,消息体可能是序列化的对象,消费者在接收到消息后需要反序列化。
  • 远程调用:如 RMI、Dubbo 等分布式系统中,对象可能需要通过网络传输,传输前会被序列化,接收方会进行反序列化。

总结

虽然你没有显式地编写反序列化的代码,但反序列化的实现通常由底层框架或库完成。你需要关注的是:

  1. 确保对象实现了 Serializable 接口,并提供了稳定的 serialVersionUID
  2. 根据具体场景选择合适的序列化/反序列化工具或框架(如 Jackson、Gson、Protobuf 等)。
  3. 确保对象的字段能够正确地被序列化和反序列化。

如果你希望了解某个具体场景的反序列化实现细节,可以进一步说明需求,我会为你详细解答。