当前位置: 首页 > news >正文

Scope作用域简单记录分析

类型

  • singleton

单例作用域

  • prototype

原型作用域

  • request

web作用域,请求作用域,生命周期跟request相同,请求开始bean被创建,请求结束bean被销毁

  • session

web作用域,会话作用域,会话开始bean被创建,会话结束bean被销毁

  • application

web作用域,应用程序作用域,应用程序创建bean呗创建,应用程序销毁bean被销毁。应用程序指的是Web的ServerletContext


singleton中使用其他类型Scope

在单例作用域bean中使用其他类型的作用域的bean,会导致作用域失效(可以这么理解吧),例如单例作用域的bean注入原型作用域的bean。(A单例,B原型)

@Component
@Data
public class A {@Autowiredprivate B b;}
@Component
@Scope("prototype")
public class B {
}

测试代码

private static void d() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Ceshi.class);A bean = context.getBean(A.class);System.out.println(bean.getB());System.out.println(bean.getB());}

Ceshi.class类扫描A.class和B.class所在的包,测试结果如下

com.example.springtest.c.B@273e7444
com.example.springtest.c.B@273e7444

预期结果是单例A getB()得到两个不同的Bean,实际结果是得到了同一个bean,这明显是错误的,因为B bean是原型作用域

失效分析

对于单例对象来讲,依赖注入只发生一次,因此在单例对象中拿到的其他作用域bean时始终是同一个


解决方案

添加@Lazy注解

@Scope注解上添加参数

@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)

这两个解决方式都是利用代理解决,每次拿到的对象是代理对象,利用代理解决效率理论上不如下边两种解决方案

用工厂方法

@Autowired
private ObjectFactory<B> b1;public B getB1(){return b1.getObject();
}

用容器

@Autowired
private ApplicationContext context;public B getB2(){return context.getBean(B.class);
}

4种解决方案的核心思想都是推迟bean的获取

http://www.lryc.cn/news/36409.html

相关文章:

  • ChatGPT创作恋爱甜文
  • 贝叶斯优化及其python实现
  • Lombok使用@Builder无法build父类属性
  • Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk
  • 后端开发过程中的安全问题
  • 基于Hyperledger Fabric的学位学历认证管理系统
  • jq条件判断验证,正则表达式
  • 23.3.9打卡 AtCoder Beginner Contest 259
  • JS - this指向
  • 低代码有哪些典型应用场景?
  • Substrate 基础教程(Tutorials) -- 监控节点指标
  • lua table 详解
  • Element表单嵌套树形表格的校验问题
  • 1.webpack的基本使用
  • 面试必看:谈谈你所了解的JVM调优,JVM性能调优总结
  • Pytorch优化器Optimizer
  • 如何在MySQL 8中实现数据迁移?这里有一个简单易用的方案
  • java多线程(二三)并发编程:Callable、Future和FutureTask
  • day4分支和循环作业
  • 轮毂要怎么选?选大还是选小?
  • RabbitMq 使用说明
  • Vue(10-20)
  • C++-对四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解
  • uni-app中使用vue3语法详解
  • 三十四、MongoDB PHP
  • 浅拷贝和深拷贝的区别
  • 6个常用Pycharm插件推荐,老手100%都用过
  • TCP的11种状态
  • new 指令简单过程 / 类加载简单过程初始化
  • Asan基本原理及试用