SpringBoot+Vue3打造企业级ERP+CRM一体化SaaS系统
核心代码,注释必读
// download:
3w ukoou com
Springboot属性填充、bean初始化、循环依赖等核心原理 Spring Boot 属性填充、Bean 初始化、循环依赖的核心原理
Spring Boot 是一个基于 Spring 框架的快速开发框架,它采用了依赖注入(DI)和控制反转(IoC)的设计模式。在了解 Spring Boot 的核心原理之前,我们需要先理解几个关键概念:
-
属性填充:在 Spring Boot 中,属性填充是指将配置文件(比如 application.properties 或 application.yml)中的属性值注入到 Java 对象中。这些属性可以是应用程序的配置参数、数据库连接信息等。
-
Bean 初始化:Bean 是 Spring 中的一个概念,它代表了由 Spring 容器管理的对象。Bean 初始化是指在 Spring 容器创建 Bean 实例时,执行相关的初始化操作,例如设置属性值、执行自定义的初始化方法等。
-
循环依赖:循环依赖指的是两个或多个 Bean 之间相互依赖,形成一个循环链路。这会导致在创建 Bean 实例时出现循环依赖的情况,从而导致 Bean 创建失败或者引发其他问题。
现在,让我们来看看 Spring Boot 中这些核心原理的实现:
-
属性填充:
-
Spring Boot 使用
@ConfigurationProperties注解来实现属性填充。在需要注入属性的类上添加该注解,然后定义对应的属性字段,Spring Boot 将会自动将配置文件中的值与字段进行绑定。 -
Spring Boot 还可以使用
@Value注解或Environment来实现属性的注入。使用@Value注解可以直接在字段上进行注入,而Environment则提供了更加灵活的属性获取方式。
-
-
Bean 初始化:
-
Spring Boot 在创建 Bean 时,会先实例化 Bean,然后再通过调用
@PostConstruct注解标记的方法来进行初始化操作。这样,我们可以在初始化方法中进行一些必要的设置和准备工作。 -
另外,我们还可以实现
InitializingBean接口或在 Bean 定义中指定init-method来定义自定义的初始化方法。
-
-
循环依赖:
- Spring Boot 使用三级缓存来解决循环依赖问题。当容器创建 Bean 时,首先会在“singletonObjects”缓存中查找是否已经存在该 Bean 的实例,如果存在则直接返回。如果没有找到,则会在“earlySingletonObjects”缓存中查找是否存在该 Bean 的早期引用,如果找到则返回该早期引用。最后,如果在前两个缓存中都没有找到,则会创建一个 ObjectFactory,该 ObjectFactory 负责创建 Bean 的实例,并将 ObjectFactory 存储在“singletonFactories”缓存中。这样,即使在创建 Bean 的过程中出现循环依赖,也能通过早期引用解决循环依赖问题。
基于RBAC,实现ERP+CRM一体化系统System模块
数据库设计
在 MySQL 数据库中创建以下表用于存储用户、角色和权限信息:
-
users表:存储用户信息sql复制代码 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL ); -
roles表:存储角色信息sql复制代码 CREATE TABLE roles ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL ); -
permissions表:存储权限信息sql复制代码 CREATE TABLE permissions ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL ); -
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 ); -
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 );
项目结构和代码实现
- 创建一个 Spring Boot 项目,添加所需依赖,包括 Spring Security 和 MySQL 数据库连接等。
- 在
application.properties中配置数据库连接信息。 - 创建实体类
User、Role和Permission,并添加 JPA 注解。 - 创建 JPA Repository 接口分别用于对
User、Role和Permission进行数据库操作。 - 创建一个实现
UserDetailsService接口的类UserDetailsServiceImpl,用于根据用户名加载用户信息。 - 实现
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();
}
}
- 创建一个控制器类
UserController,用于处理用户相关的请求。
java复制代码
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/admin/users")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
// 添加其他用户管理相关的接口
}
- 创建一个
UserService接口和其实现类UserServiceImpl,用于处理用户的业务逻辑。
java复制代码
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> getAllUsers() {
return userRepository.findAll();
}
// 添加其他用户管理相关的业务逻辑
}
- 同样,创建
RoleService和PermissionService接口及其实现类,用于处理角色和权限的业务逻辑。