SpringBoot+Vue3打造企业级ERP+CRM一体化SaaS系统「高清」

436 阅读4分钟

SpringBoot+Vue3打造企业级ERP+CRM一体化SaaS系统

核心代码,注释必读

// download:3w ukoou com

Springboot属性填充、bean初始化、循环依赖等核心原理 Spring Boot 属性填充、Bean 初始化、循环依赖的核心原理

Spring Boot 是一个基于 Spring 框架的快速开发框架,它采用了依赖注入(DI)和控制反转(IoC)的设计模式。在了解 Spring Boot 的核心原理之前,我们需要先理解几个关键概念:

  1. 属性填充:在 Spring Boot 中,属性填充是指将配置文件(比如 application.properties 或 application.yml)中的属性值注入到 Java 对象中。这些属性可以是应用程序的配置参数、数据库连接信息等。

  2. Bean 初始化:Bean 是 Spring 中的一个概念,它代表了由 Spring 容器管理的对象。Bean 初始化是指在 Spring 容器创建 Bean 实例时,执行相关的初始化操作,例如设置属性值、执行自定义的初始化方法等。

  3. 循环依赖:循环依赖指的是两个或多个 Bean 之间相互依赖,形成一个循环链路。这会导致在创建 Bean 实例时出现循环依赖的情况,从而导致 Bean 创建失败或者引发其他问题。

现在,让我们来看看 Spring Boot 中这些核心原理的实现:

  1. 属性填充

    • Spring Boot 使用 @ConfigurationProperties 注解来实现属性填充。在需要注入属性的类上添加该注解,然后定义对应的属性字段,Spring Boot 将会自动将配置文件中的值与字段进行绑定。

    • Spring Boot 还可以使用 @Value 注解或 Environment 来实现属性的注入。使用 @Value 注解可以直接在字段上进行注入,而 Environment 则提供了更加灵活的属性获取方式。

  2. Bean 初始化

    • Spring Boot 在创建 Bean 时,会先实例化 Bean,然后再通过调用 @PostConstruct 注解标记的方法来进行初始化操作。这样,我们可以在初始化方法中进行一些必要的设置和准备工作。

    • 另外,我们还可以实现 InitializingBean 接口或在 Bean 定义中指定 init-method 来定义自定义的初始化方法。

  3. 循环依赖

    • Spring Boot 使用三级缓存来解决循环依赖问题。当容器创建 Bean 时,首先会在“singletonObjects”缓存中查找是否已经存在该 Bean 的实例,如果存在则直接返回。如果没有找到,则会在“earlySingletonObjects”缓存中查找是否存在该 Bean 的早期引用,如果找到则返回该早期引用。最后,如果在前两个缓存中都没有找到,则会创建一个 ObjectFactory,该 ObjectFactory 负责创建 Bean 的实例,并将 ObjectFactory 存储在“singletonFactories”缓存中。这样,即使在创建 Bean 的过程中出现循环依赖,也能通过早期引用解决循环依赖问题。

基于RBAC,实现ERP+CRM一体化系统System模块

数据库设计

在 MySQL 数据库中创建以下表用于存储用户、角色和权限信息:

  1. users 表:存储用户信息

    sql复制代码
    CREATE TABLE users (
      id INT PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      password VARCHAR(100) NOT NULL
    );
    
  2. roles 表:存储角色信息

    sql复制代码
    CREATE TABLE roles (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(50) NOT NULL
    );
    
  3. permissions 表:存储权限信息

    sql复制代码
    CREATE TABLE permissions (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(50) NOT NULL
    );
    
  4. role_permissions 表:角色与权限之间的关联表

    sql复制代码
    CREATE TABLE role_permissions (
      role_id INT NOT NULL,
      permission_id INT NOT NULL,
      PRIMARY KEY (role_id, permission_id),
      FOREIGN KEY (role_id) REFERENCES roles (id) ON DELETE CASCADE,
      FOREIGN KEY (permission_id) REFERENCES permissions (id) ON DELETE CASCADE
    );
    
  5. user_roles 表:用户与角色之间的关联表

    sql复制代码
    CREATE TABLE user_roles (
      user_id INT NOT NULL,
      role_id INT NOT NULL,
      PRIMARY KEY (user_id, role_id),
      FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
      FOREIGN KEY (role_id) REFERENCES roles (id) ON DELETE CASCADE
    );
    

项目结构和代码实现

  1. 创建一个 Spring Boot 项目,添加所需依赖,包括 Spring Security 和 MySQL 数据库连接等。
  2. application.properties 中配置数据库连接信息。
  3. 创建实体类 UserRolePermission,并添加 JPA 注解。
  4. 创建 JPA Repository 接口分别用于对 UserRolePermission 进行数据库操作。
  5. 创建一个实现 UserDetailsService 接口的类 UserDetailsServiceImpl,用于根据用户名加载用户信息。
  6. 实现 WebSecurityConfigurerAdapter 来配置 Spring Security。
java复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
            .anyRequest().authenticated()
            .and().formLogin()
            .and().logout().logoutSuccessUrl("/login").permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  1. 创建一个控制器类 UserController,用于处理用户相关的请求。
java复制代码
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/admin/users")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    // 添加其他用户管理相关的接口
}
  1. 创建一个 UserService 接口和其实现类 UserServiceImpl,用于处理用户的业务逻辑。
java复制代码
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    // 添加其他用户管理相关的业务逻辑
}
  1. 同样,创建 RoleService 和 PermissionService 接口及其实现类,用于处理角色和权限的业务逻辑。