Spring的读取和存储对象

本文详细介绍了Spring如何存储和获取Bean对象,包括使用注解存储Bean,如@Controller、@Service等,以及通过@Autowired和@Resource进行属性和构造注入。同时,讨论了Bean的作用域,如singleton和prototype,并解析了Bean的生命周期,从实例化、属性设置到初始化和销毁的全过程。

一、存储Bean对象

第一步:配置扫描路径

首先要明确的是这一步是非常重要的。只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。

        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext是其中一个实现类,
        // 作用:
        //  1. 扫描指定包路径下,使用Spring框架注解的类。
        //  2. 注册这些类到容器中=》框架帮助我们new对象,及注入队象依赖关系
        ApplicationContext context
                = new AnnotationConfigApplicationContext("org.example");

第二步:添加注解存储Bean对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:

1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。

2. 方法注解:@Bean

我们还要认识的是:方法注解@Bean

这块要注意的是方法注解要配合类注解使用。如果我们单单使用Bean注解的话,要想获取Bean对象中的值,我们会发现获取不到。

二、获取Bean对象(装配/注入)

2.1 属性注入

属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中
分层的依赖关系:51a7196990b7425b94a35f1ba2b832cd.png

 

 

package org.example.controller;

import lombok.Data;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
@Data// lombok注解:自动生成Getter、Setter、hashCode、equals、toString
public class UserController {

    //使用String容器,帮助我们将Bean容器中的
    @Autowired
    private UserService userService;

}
--------------------------------------------------------------------------------
package org.example.service;

import lombok.Data;
import org.example.mapper.UserRepository
<think>我们注意到用户的问题发生了变化:现在用户想了解的是在Spring Boot 3中使用YAML 2.4读取写入对象到文件的方法。 回顾之前的引用: 引用[1]:定义了一个读取YAML文件的接口,但未涉及写入。 引用[2]:主要讲配置文件yaml结构,以及根据profiles读取不同配置。 引用[3]:介绍如何从YAMLProperties配置文件中读取List数据。 引用[4]:Spring Boot读取YAML配置文件的注意事项(缩进规则、类型安全、配置覆盖)。 然而,用户当前的问题并不是关于Spring Boot配置文件的读取(如application.yml),而是关于使用YAML 2.4(应该是SnakeYAML 2.4)来读写任意YAML文件(可能是非配置文件)的方法。 因此,我们需要调整方向:讲解如何在Spring Boot 3中使用SnakeYAML库(版本2.4以上)来读写YAML文件中的对象。 步骤: 1. 添加SnakeYAML依赖(Spring Boot 3默认可能已经包含,但如果没有,需要显式添加) 2. 使用SnakeYAML的API来加载(读取转储(写入)对象到YAML文件。 注意:Spring Boot 3默认使用的Spring Framework 6,而Spring Framework 6本身并不直接提供YAML文件的读写工具(除了用于配置文件的解析)。因此,我们将直接使用SnakeYAML库。 具体实现: 1. 添加依赖: 在pom.xml中加入: ```xml <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.4</version> <!-- 或更高版本 --> </dependency> ``` 2. 读取YAML文件到对象: 假设我们有一个YAML文件(例如data.yaml)如下: ```yaml name: John Doe age: 30 hobbies: - Reading - Hiking ``` 我们可以定义一个对应的Java类: ```java public class Person { private String name; private int age; private List<String> hobbies; // 必须有无参构造函数 public Person() { } // getters and setters } ``` 然后使用SnakeYAML读取: ```java import org.yaml.snakeyaml.Yaml; import java.io.InputStream; import java.io.FileInputStream; public class YamlReader { public static void main(String[] args) { Yaml yaml = new Yaml(); try (InputStream inputStream = new FileInputStream("data.yaml")) { Person person = yaml.loadAs(inputStream, Person.class); System.out.println(person.getName()); } catch (Exception e) { e.printStackTrace(); } } } ``` 3. 将对象写入YAML文件: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileWriter; import java.io.IOException; public class YamlWriter { public static void main(String[] args) { Person person = new Person(); person.setName("Jane Doe"); person.setAge(25); person.setHobbies(Arrays.asList("Swimming", "Painting")); Yaml yaml = new Yaml(); try (FileWriter writer = new FileWriter("output.yaml")) { yaml.dump(person, writer); } catch (IOException e) { e.printStackTrace(); } } } ``` 4. 注意事项: - 读取写入的类必须有无参构造函数,并且有对应的gettersetter方法。 - SnakeYAML默认会将对象转储为标准的YAML格式。 - 如果需要更复杂的结构(如嵌套对象、列表等),SnakeYAML可以自动处理。 5. 结合Spring Boot 3: 在Spring Boot应用中,我们可以将YAML读写封装成服务,然后在需要的地方注入使用。 例如,我们可以创建一个YamlService: ```java import org.springframework.stereotype.Service; import org.yaml.snakeyaml.Yaml; import java.io.*; @Service public class YamlService { public <T> T readYaml(String filePath, Class<T> type) { Yaml yaml = new Yaml(); try (InputStream inputStream = new FileInputStream(filePath)) { return yaml.loadAs(inputStream, type); } catch (IOException e) { throw new RuntimeException("Error reading YAML file", e); } } public void writeYaml(String filePath, Object object) { Yaml yaml = new Yaml(); try (FileWriter writer = new FileWriter(filePath)) { yaml.dump(object, writer); } catch (IOException e) { throw new RuntimeException("Error writing YAML file", e); } } } ``` 然后在Controller或其他组件中注入并使用: ```java @RestController public class MyController { @Autowired private YamlService yamlService; @GetMapping("/person") public Person getPerson() { return yamlService.readYaml("data.yaml", Person.class); } @PostMapping("/person") public void savePerson(@RequestBody Person person) { yamlService.writeYaml("data.yaml", person); } } ``` 6. 引用说明:引用[1]中提到了一个读取YAML文件的接口,我们可以参考其思想,但这里我们使用了具体的实现(SnakeYAML)。 7. 关于YAML 2.4:这里指的是SnakeYAML的版本,SnakeYAML是处理YAML的Java库,2.4版本支持YAML 1.2规范。 8. 高级特性:如果需要处理多个文档(一个YAML文件包含多个文档,用`---`分隔),可以使用`loadAll`方法。 例如,读取多个文档: ```java Iterable<Object> objects = yaml.loadAll(inputStream); ``` 写入多个文档: ```java List<Object> documents = ...; // 多个对象 for (Object obj : documents) { yaml.dump(obj, writer); // 写入分隔符 writer.write("---\n"); } ``` 9. 注意事项:SnakeYAML在写入时不会保留原始文件的注释格式,它只关注数据结构。如果需要保留注释等,可能需要使用其他库或手动处理。 综上,在Spring Boot 3中使用SnakeYAML 2.4进行YAML文件的读写操作是直接而简单的,通过封装服务可以方便地在应用中使用。 生成相关问题: 1. 如何在Spring Boot中使用SnakeYAML处理多个YAML文档? 2. 使用SnakeYAML读写YAML文件时如何保留注释? 3. Spring Boot 3中如何自定义SnakeYAML的配置(如设置DumperOptions)? </think>在 Spring Boot 3 中使用 SnakeYAML 2.4 实现对象的读写操作,可通过以下步骤实现: ### 一、核心依赖配置 在 `pom.xml` 中添加依赖(确保使用 SnakeYAML 2.4+): ```xml <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.4</version> <!-- 兼容 Spring Boot 3 --> </dependency> ``` ### 二、读写操作实现 #### 1. 对象定义示例 ```java public class UserProfile { private String name; private int age; private List<String> skills; // 支持复杂数据结构 // 必须有无参构造器 // Getter/Setter 省略(需通过 Lombok 或手动生成) } ``` #### 2. **写入对象到 YAML 文件** ```java import org.yaml.snakeyaml.Yaml; import java.io.FileWriter; public class YamlWriter { public void writeToFile(String filePath, Object data) { Yaml yaml = new Yaml(); try (FileWriter writer = new FileWriter(filePath)) { yaml.dump(data, writer); // 序列化对象到文件 } } } // 使用示例 UserProfile user = new UserProfile("Alice", 30, Arrays.asList("Java", "Spring")); new YamlWriter().writeToFile("user-profile.yml", user); ``` 生成的文件内容: ```yaml !!com.example.UserProfile age: 30 name: Alice skills: - Java - Spring ``` #### 3. **从 YAML 文件读取对象** ```java import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; public class YamlReader { public <T> T readFromFile(String filePath, Class<T> type) { Yaml yaml = new Yaml(); try (FileInputStream input = new FileInputStream(filePath)) { return yaml.loadAs(input, type); // 反序列化为指定类型 } } } // 使用示例 UserProfile user = new YamlReader().readFromFile("user-profile.yml", UserProfile.class); System.out.println(user.getName()); // 输出: Alice ``` ### 三、高级特性 #### 1. 处理多文档 YAML ```java // 写入多个文档 List<Object> documents = Arrays.asList(user1, user2); try (FileWriter writer = new FileWriter("users.yml")) { for (Object doc : documents) { yaml.dump(doc, writer); writer.write("---\n"); // 文档分隔符 } } // 读取多个文档 try (FileInputStream input = new FileInputStream("users.yml")) { Iterable<Object> objs = yaml.loadAll(input); objs.forEach(obj -> System.out.println(obj.getClass())); } ``` #### 2. 自定义 YAML 格式 ```java import org.yaml.snakeyaml.DumperOptions; DumperOptions options = new DumperOptions(); options.setIndent(4); // 缩进4空格 options.setPrettyFlow(true); // 美化格式 options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); // 块样式 Yaml customYaml = new Yaml(options); // 使用自定义配置 ``` ### 四、Spring Boot 集成建议 1. **封装为服务**: ```java @Service public class YamlService { private final Yaml yaml = new Yaml(); public void saveConfig(String path, Object config) { // 写入实现 } public <T> T loadConfig(String path, Class<T> type) { // 读取实现 } } ``` 2. **结合配置类**: ```java @ConfigurationProperties(prefix = "app") public class AppConfig { private String theme; private int maxItems; // Getter/Setter } // 保存配置到文件 yamlService.saveConfig("custom-config.yml", appConfig); ``` ### 注意事项 1. **安全性**:反序列化时避免加载不受信任的 YAML 文件(存在安全风险)[^4] 2. **类型兼容**:集合类型需使用接口声明(如 `List` 而非 `ArrayList`) 3. **无参构造器**:目标类必须有无参构造器(否则反序列化失败) 4. **复杂对象**:嵌套对象需确保所有层级都可序列化 > 通过 SnakeYAML 的直接 API 调用,比 Spring Boot 原生的 `@ConfigurationProperties` 更灵活,适用于非标准配置文件的读写需求[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值