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

Spring 单例注入其它 scope 的四种解决方法 @Scope 源码解读

@Scope 注解源码解读

当与@Component一起用作类型级别的注解时,@ @Scope指示用于注解类型实例的范围名称。
当与@Bean一起用作方法级别的注释时, @Scope指示用于从方法返回的实例的范围名称

 属性:value() & scopeName()

singleton、prototype、servletContext、application、session、request

属性:proxyMode

DEFAULT、NO、INTERFACES、TARGET_CLASS

 

@Scope的缺省属性

scopeName() default "" 默认为空字符串 ( "" ),这意味着SCOPE_SINGLETON 
proxyMode() default ScopedProxyMode.DEFAULT;

 

单例注入其它 scope 的四种解决方法

  • @Lazy

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

  • ObjectFactory

  • ApplicationContext

  1. 解决方法虽然不同,但理念上殊途同归: 都是推迟其它 scope bean 的获取

代码演示

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
package com.jay;

@Scope("prototype")
@Component
public class F1 {
}
package com.jay;

@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class F2 {
}
package com.jay;

@Scope("prototype")
@Component
public class F3 {
}
package com.jay;

@Scope("prototype")
@Component
public class F4 {
}
package com.jay;

@Component
public class E {

    @Lazy
    @Autowired
    private F1 f1;

    @Autowired
    private F2 f2;

    @Autowired
    private ObjectFactory<F3> f3;

    @Autowired
    private ApplicationContext context;

    public F1 getF1() {
        return f1;
    }

    public F2 getF2() {
        return f2;
    }

    public F3 getF3() {
        return f3.getObject();
    }

    public F4 getF4() {
        return context.getBean(F4.class);
    }
}
@ComponentScan("com.jay") // 所有@Component 所在的位置
public class A08_1 {

    private static final Logger log = LoggerFactory.getLogger(A08_1.class);

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(A08_1.class);

        E e = context.getBean(E.class);
        log.debug("{}", e.getF1().getClass());
        log.debug("{}", e.getF1());
        log.debug("{}", e.getF1());
        log.debug("{}", e.getF1());

        log.debug("{}", e.getF2().getClass());
        log.debug("{}", e.getF2());
        log.debug("{}", e.getF2());
        log.debug("{}", e.getF2());

        log.debug("{}", e.getF3());
        log.debug("{}", e.getF3());

        log.debug("{}", e.getF4());
        log.debug("{}", e.getF4());

        context.close();
        /*
            学到了什么
                a. 单例注入其它 scope 的四种解决方法
                b. 解决方法虽然不同, 但理念上殊途同归: 都是推迟其它 scope bean 的获取
         */
    }
}

相关文章:

  • FastAPI简介与快速体验
  • 《微信小程序案例9》小程序登录流程
  • 【Python初级人工智能精讲】用Paddlehub给一段没有标点符号的文字加上合适的标点符号
  • idea使用fiddler抓包分析,fiddler抓取https
  • (附源码)python旅游推荐系统 毕业设计 250623
  • 泛型 和 IO流 和 网络编程
  • js 复制内容到剪切板
  • redis中的锁,通过UUID防止误删
  • 生命在于折腾——浅谈羊了个羊
  • 微雪树莓派PICO笔记——6. I2C(集成电路总线)
  • 容斥原理
  • RealityCapture摄影测量软件
  • TransBigData:一款基于 Python 的超酷炫交通时空大数据工具包
  • 矩阵理论复习部分——线性代数(1)行列式
  • 3 MyBatis 级联操作
  • SegmentFault for Android 3.0 发布
  • 2019年如何成为全栈工程师?
  • Angular6错误 Service: No provider for Renderer2
  • Asm.js的简单介绍
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java应用性能调优
  • JS实现简单的MVC模式开发小游戏
  • Node + FFmpeg 实现Canvas动画导出视频
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 给github项目添加CI badge
  • 回流、重绘及其优化
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 软件开发学习的5大技巧,你知道吗?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 以太坊客户端Geth命令参数详解
  • 优秀架构师必须掌握的架构思维
  • AI算硅基生命吗,为什么?
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #单片机(TB6600驱动42步进电机)
  • $.ajax()方法详解
  • (+4)2.2UML建模图
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (独孤九剑)--文件系统
  • (二)正点原子I.MX6ULL u-boot移植
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十八)SpringBoot之发送QQ邮件
  • (一)Java算法:二分查找
  • (一)基于IDEA的JAVA基础1
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)VC++中ondraw在什么时候调用的
  • (转)甲方乙方——赵民谈找工作
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全