赞
踩
概念:
三级缓存是指用于管理 Bean 对象创建过程中不同阶段的缓存机制。
意义:
由于创建Bean的代码量非常多,本文仅展示与三级缓存有关的代码。
读者想要对三级缓存了解更加深刻,可以自行创建循环依赖的Bean,根据调试来解读代码。
这里仅仅展示创建Bean的大致流程图,想深入了解的读者可以自行解读源码。
在实际开发中,我们通常不需要直接操作 Spring 的三级缓存,因为 Spring 框架会自动管理这些缓存。只需要通过合适的配置和编码实践来确保 bean 的正确创建和管理即可。
在实际开发中使用 Spring 的三级缓存简单Demo:
假设有一个简单的服务接口 UserService
和其实现类 UserServiceImpl
,将使用 Spring 来管理它们的依赖注入和单例管理。
public interface UserService {
void addUser(String username);
}
public class UserServiceImpl implements UserService {
private List<String> users = new ArrayList<>();
@Override
public void addUser(String username) {
users.add(username);
}
}
现在配置 Spring 容器并将 UserServiceImpl
注入到容器中:
/*
* 定义了一个配置类 AppConfig,在其中通过 @Bean 注解定义了一个名为 userService 的 Bean,并指定了它的实现类为 UserServiceImpl
*/
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Spring 默认情况下会使用单例模式管理 Bean,所以每次获取 UserService Bean 都会得到同一个实例
// 从 Spring 应用上下文中获取一个名为 userService 的 Bean,其类型为 UserService。在 AppConfig 中定义了 userService Bean,并且它的实现类为 UserServiceImpl,所以这里实际上是获取了一个 UserServiceImpl 类型的对象
UserService userService1 = context.getBean(UserService.class);
userService1.addUser("Alice");
// 再次从 Spring 应用上下文中获取一个 UserService 类型的 Bean,实际上是获取了之前已经创建过的同一个 UserServiceImpl 类型的对象
UserService userService2 = context.getBean(UserService.class);
userService2.addUser("Bob");
// 可给对象做一些其它额外的操作
// 关闭了 Spring 应用上下文,释放资源
context.close();
}
}
分析 Spring 是如何使用三级缓存的:
@Bean
或者其他方式声明一个 bean 时,Spring 首先会检查 BeanDefinition 缓存中是否存在该 bean 的定义,如果存在,则直接使用该定义,否则会根据配置信息创建一个新的 BeanDefinition。在 Spring 中,虽然没有官方定义的 “三级缓存” 概念,但可以类比于 MyBatis 中的缓存机制。
从 Spring 的缓存相关模块(如 Spring Cache)的角度来看,也存在一些可能的问题以及解决方法。
今是生活,今是动力,今是行为,今是创作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。