首页 > 其他分享 >Spring BeanFactoryAware 解决 prototype 作用域失效问题

Spring BeanFactoryAware 解决 prototype 作用域失效问题

时间:2023-12-28 21:12:51浏览次数:38  
标签:register beanFactory 作用域 Spring BeanFactory BeanFactoryAware UserService prototy

跟着孙哥学Spring,b站:https://www.bilibili.com/video/BV185411477k/?spm_id_from=333.337.search-card.all.click

在 Spring 中,如果一个 singleton bean 依赖了一个 prototype bean,那么这个 prototype bean 在初始化时只会被创建一次,这就是所谓的 "prototype scope 失效" 的问题。这是因为 singleton bean 在初始化时会创建并注入所有的依赖,而这个过程只会发生一次。

为了解决这个问题,我们可以使用 BeanFactoryAware 接口。BeanFactoryAware 是 Spring 提供的一个特殊接口,任何实现了这个接口的 bean 都可以获取到 BeanFactory 的引用。有了 BeanFactory 的引用,我们就可以在需要的时候,手动从 BeanFactory 中获取 prototype bean 的新实例。

以下是一个示例:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class UserServiceImpl implements UserService, BeanFactoryAware {
    private BeanFactory beanFactory;

    public UserServiceImpl() {
        System.out.println("UserServiceImpl.UserServiceImpl");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Override
    public void register() {
        UserDAO userDAO = (UserDAO) beanFactory.getBean("userDAO");
        System.out.println("userDAO = " + userDAO);
        userDAO.save();
    }
}

在这个示例中,UserServiceImpl 实现了 BeanFactoryAware 接口,并重写了 setBeanFactory 方法,这样就可以获取到 BeanFactory 的引用。然后,在 register 方法中,我们手动从 BeanFactory 中获取了 UserDAO 的新实例。这样,每次调用 register 方法时,都会获取一个新的 UserDAO 实例,从而解决了 "prototype scope 失效" 的问题。

测试

我们可以通过以下测试代码来验证上述解决方案:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService userService = (UserService) beanFactory.getBean("userService");
UserService userService1 = (UserService) beanFactory.getBean("userService");

userService.register();
userService1.register();

在这段测试代码中,我们首先从 BeanFactory 中获取了两次 UserService 的实例,然后分别调用了它们的 register 方法。由于 UserService 是 singleton 的,所以 userServiceuserService1 实际上是同一个实例。但是,由于我们在 register 方法中手动从 BeanFactory 中获取了 UserDAO 的新实例,所以每次调用 register 方法时,都会获取一个新的 UserDAO 实例,从而解决了 "prototype scope 失效" 的问题。

孙哥的讲解图例

image

标签:register,beanFactory,作用域,Spring,BeanFactory,BeanFactoryAware,UserService,prototy
From: https://www.cnblogs.com/zzusjw/p/17933575.html

相关文章

  • RocketMQ系统性学习-SpringCloud Alibaba集成RocketMQ以及消费收发实战
    欢迎关注公众号:【11来了】发送“资料”可以下载Redis、JVM系列文章PDF版本!作者为在读研究生,目前研二,计划在公众号记录学习常用中间件笔记,以及明年更新面试经历!SpringCloudAlibaba集成RocketMQ最佳实践SpringBoot相对于SSM来说已经很大程度上简化了开发,但是使用SpringBo......
  • Maven插件系列之spring-boot-maven-plugin
    SpringBoot的Maven插件(SpringBootMavenplugin)能够以Maven的方式为应用提供SpringBoot的支持,即为SpringBoot应用提供了执行Maven操作的可能。SpringBootMavenplugin能够将SpringBoot应用打包为可执行的jar或war文件,然后以通常的方式运行SpringBoot应用。SpringBootMave......
  • springcloud动力节点-01Eureka
    SpringCloudEureka1.SpringCloudEureka简介注册发现中心Eureka来源于古希腊词汇,意为“发现了”。在软件领域,Eureka是Netflix在线影片公司开源的一个服务注册与发现的组件,和其他Netflix公司的服务组件(例如负载均衡、熔断器、网关等)一起,被SpringCloud社区整合......
  • springcloud动力节点-05Sleuth
    SpringCloudSleuth1.什么是链路追踪官网:https://spring.io/projects/spring-cloud-sleuth链路追踪就是:追踪微服务的调用路径2.链路追踪的由来在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个请求都会开成一......
  • springcloud动力节点-04Hystrix
    SpringCloudHystrix1.前言1.1什么是服务雪崩   服务雪崩的本质:线程没有及时回收。不管是调用成功还是失败,只要线程可以及时回收,就可以解决服务雪崩1.2服务雪崩怎么解决1.2.1修改调用的超时时长(不推荐)将服务间的调用超时时长改小,这样就可以让线程及时回收,保证服......
  • springcloud动力节点-03OpenFeign
    SpringCloudOpenFeign 1.说在前面上一节我们讲到Ribbon做了负载均衡,用Eureka-Client来做服务发现,通过RestTemplate来完成服务调用,但是这都不是我们的终极方案,终极方案是使用OpenFeign2.OpenFeign简介https://docs.spring.io/spring-cloud-open......
  • Spring Cloud动力节点-07Alibaba简介、注册、配置中心
    1.项目简介SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。依托SpringCloudAlibaba,您只需要添加一些注解和少量配置,就可以将SpringClo......
  • springcloud动力节点-06Admin监控 Or Gateway网关
    SpringCloudAdmin 监控端点新建工程:admin-serverpom中springcloud版本号和版本控制要添加<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan......
  • 微服务框架 SpringCloud微服务架构3
    微服务框架SpringCloud微服务架构3Eureka3.1提供者与消费者3.1.1一些概念服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)在我们的Demo案例中  很明显两者是如下的关系:3......
  • 开源免费又好用的中式数据报表:UReport2是一款高性能的架构在Spring之上纯Java报表引
    北润乾、南帆软,数加发力在云端。uReport身何安?中式报表真开源。报表江湖之中,uReport安身立命的产品品类定位是什么?说来很简单,uReport的价值在于填补了这样一个市场空白:开源免费又好用的中式数据报表UReport2是一款高性能的架构在Spring之上纯Java报表引擎,通过迭代单元格可以......