Spring Boot 学习笔记:组件扫描与依赖注入

135 阅读2分钟

Spring Boot 学习笔记:组件扫描与依赖注入

目录

  1. 概述
  2. 项目结构与文件目录
  3. 三个文件之间的关系
  4. Bean 的定义与注入
  5. 代码示例
  6. 总结

概述

本笔记详细解析了一个简单的 Spring Boot 应用程序中的关键组件:UserRepositoryUserServiceDemoApplication。通过这些文件,我们可以了解 Spring Boot 中的数据访问层、业务逻辑层和应用启动层的实现方式,以及组件扫描和依赖注入的具体应用。

项目结构与文件目录

假设我们的 Spring Boot 项目结构如下:

com.example.demo
  ├── DemoApplication.java
  ├── model
  │   └── User.java
  ├── repository
  │   └── UserRepository.java
  └── service
      └── UserService.java

文件目录说明

com.example.demo:主包,包含所有类和子包。 • DemoApplication.java:Spring Boot 应用的主类。 • model:包含数据模型类,如 User.java。 • repository:包含数据访问层类,如 UserRepository.java。 • service:包含业务逻辑层类,如 UserService.java

三个文件之间的关系

1. DemoApplicationUserService的关系

启动与依赖注入: • DemoApplication是Spring Boot应用的入口点,负责启动整个应用。 • 在main方法中,通过ApplicationContext获取UserService的Bean实例。 • 这表明DemoApplication依赖于UserService,但这种依赖是通过Spring的依赖注入机制隐式管理的。

2. UserServiceUserRepository的关系

业务逻辑与数据访问: • UserService是业务逻辑层,负责处理应用程序的核心业务逻辑。 • UserRepository是数据访问层,负责与数据库或其他数据源进行交互,执行具体的数据操作。 • 依赖与注入: • UserService通过构造函数注入UserRepository的实例。 • 这意味着UserService依赖于UserRepository来执行其业务逻辑中的数据访问操作。

3. DemoApplicationUserRepository的关系

间接依赖: • 虽然DemoApplication没有直接依赖于UserRepository,但它通过UserService间接依赖于UserRepository。 • 这种间接依赖关系是通过Spring的依赖注入和组件扫描机制实现的。

Bean 的定义与注入

Bean 的定义:通过 @Service@Repository@Component 等注解定义 Bean。 • 依赖注入:通过构造函数注入、字段注入或 Setter 方法注入实现 Bean 之间的依赖关系。

代码示例

UserRepository.java

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public User findById(Long id) {
        // 模拟数据库查询
        return new User(id, "John Doe");
    }
}

UserService.java

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id);
    }
}

DemoApplication.java

package com.example.demo;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        UserService userService = context.getBean(UserService.class);
        User user = userService.getUserById(1L);
        System.out.println(user.getName());
    }
}

总结

通过 UserRepositoryUserServiceDemoApplication 三个文件,我们可以清晰地看到 Spring Boot 应用的分层架构和依赖注入机制。这种分层架构提高了代码的可维护性和可测试性,使得业务逻辑和数据访问逻辑分离,便于后续的开发和维护。