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

@Scope失效问题

        单例的Bean注入其它类型的@Scope属性有可能会失效,针对失效的情况,我们可以采取四种解决办法。

一.失效场景

1.准备多例Bean

package com.example.springdemo.demos.a27;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Scope("prototype")
@Component
public class F1 {
}

 2.E中注入F1

package com.example.springdemo.demos.a27;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Component
public class E {@Autowiredprivate  F1 f1;public F1 getF1(){return f1;}
}

  3.容器中获取对象

package com.example.springdemo.demos.a27;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:54*/
@ComponentScan("com.example.springdemo.demos.a27")
public class a27Application {private static final Logger log = LoggerFactory.getLogger(a27Application.class);public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(a27Application.class);E e = context.getBean(E.class);log.info("{}",e.getF1().getClass());log.info("{}",e.getF1());log.info("{}",e.getF1());log.info("{}",e.getF1());}
}

结果:

        通过依赖注入的F1对象多次获取后都是同一个,Scope作用失效了。分析其原因是对于单例对象E来讲,依赖注入仅仅发生了一次,后续再也没有使用多例的F1,所以多次获取都是同一个对象。

二.解决办法

      下面提供四种解决方法。

1.添加@Lazy注解

package com.example.springdemo.demos.a27;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Component
public class E {@Lazy@Autowiredprivate  F1 f1;public F1 getF1(){return f1;}
}

       结果每次获取出不同的F1对象。使用@Lazy注解之后,注入便是F1的代理对象(注意看输出的F1对象的类型),e.getF1()使用了F1代理类的toString(),而每次使用代理对象的方法都会创建新的F1对象。

2.在Scope属性中设置proxyMode

       设置proxyMode的值为ScopedProxyMode.TARGET_CLASS,可以为F1对象生成代理对象,与上面方法类似。

package com.example.springdemo.demos.a27;import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class F1 {
}

3.使用ObjectFactory包装F1

package com.example.springdemo.demos.a27;import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Component
public class E {@Autowiredprivate ObjectFactory<F1> f1;public F1 getF1(){return f1.getObject();}
}

        通过这种方式每次获取F1,工厂都可以生成多例对象。

4.注入ApplicationContext容器

        每次从容器中获取F1对象自然是多例的。

package com.example.springdemo.demos.a27;import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/15 21:56*/
@Component
public class E {@Autowiredprivate ApplicationContext context;public F1 getF1(){return context.getBean(F1.class);}
}

http://www.dtcms.com/a/486163.html

相关文章:

  • Service 网络原理
  • 数据复制问题及其解决方案
  • Java-Spring入门指南(二十五)Android 的历史,认识移动应用和Android 基础知识
  • WPF依赖属性(Dependency Property)详解
  • 深度学习进阶(三)——生成模型的崛起:从自回归到扩散
  • 三门峡网站开发ict网站建设
  • 神经网络之链式法则
  • C#设计模式源码讲解
  • 性能测试单场景测试时,是设置并发读多个文件,还是设置不同的用户读不同的文件?
  • Qt初识(对象树,乱码问题,小结)
  • 基于Home Assistant的机器人低延迟通信项目详细调研报告
  • 深圳网站做的好的公司婚庆网站开发目的
  • 中小企业网站制作是什么宁德网站建设51yunsou
  • 代理模式 vs AOP:支付服务中的日志增强实践(含执行顺序详解)
  • linux系统运维教程,linux系统运维攻略
  • string字符集
  • Linux 命令:fsck
  • 如何提升生物科技研发辅助的效率?
  • ECEF坐标转换库
  • 企业商务网被公司优化掉是什么意思
  • 网站虚拟主机购买教程专业网站设计工作室
  • 数据库管理-第376期 Oracle AI DB 23.26新特性一览(20251016)
  • 【Nature高分思路速递】 物理驱动的机器学习
  • word文档转pdf开源免费,可自定义水印
  • k8s(五)PV和PVC详解
  • 深度学习与自然语言处理
  • python 部署可离线使用的中文识别OCR(window)
  • 湖州微信网站建设网站301了不知道在哪做的
  • 请描述网站开发的一般流程图php网站开发经理招聘
  • 关于pkg-config的使用示例--g++编译过程引入第三方库(如Opencv、Qt)