为什么在 Spring Boot 中注入线程作用域的 Bean 而不是默认作用域的 Bean?

问题描述 投票:0回答:1

我最近对我的 Spring Boot 项目进行了更改。我最初有一个没有特定范围的 bean。由于使用线程的实现以及并发问题的发生,我需要创建另一个与前一个相同的 bean,但具有使用 SimpleThreadScope 的线程作用域。但是,当我在服务中使用第一个 bean 进行批处理时,第二个 bean 被错误地注入,即使引用指示第一个 bean。为了解决这个问题,我无法向bean添加限定符,因为项目非常大。

下面是我的代码结构。

app-config.xml

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="thread">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>


<bean id="reportService" class="it.myproject.service.report.ReportService">
    <property name="exporter" ref="exporter" />
    <property name="writer" ref="writer" />
</bean>


<bean id="reportServiceAsync" class="it.myproject.service.report.ReportService" scope="thread">
    <aop:scoped-proxy/>
    <property name="exporter" ref="exporter" />
    <property name="writer" ref="writer" />
</bean>



<bean id="myMagicBean" class="it.myproject.batch.MyMagicBean">
    <property name="reportService" ref="reportService" />
</bean>

我无法理解为什么

myMagicBean
注入
reportServiceAsync
而不是
reportService
,如我的配置中所定义。

如何解决这个问题? 谁能解释一下为什么会发生这种情况?

提前非常感谢您的帮助。

spring spring-boot dependency-injection concurrency scope
1个回答
0
投票

感谢@M.Deinum的评论,我意识到问题出在我的

ReportService
中,并且使用线程范围是不合适的。我通过删除各种方法之间的共享属性解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.