春季启动-如果将SCOPE_REQUEST Bean手动初始化,则将其转换为Singleton

时间:2019-01-28 23:25:14

标签: java spring spring-boot spring-bean

我面临一种奇怪的情况,即当手动初始化SCOPE_REQUEST bean时,它变成了Singleton。下面是详细信息:

请求范围Bean:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ServiceHeader {
    private String correlationId;
    private String requestId;
    private String requestedBy;
    //getters & setters
}

自动将该bean连接到Service类

@Service
public class ExportService {
    @Autowired
    private ServiceHeader serviceHeader;

    //Regular service method that access to variables of the request
    public void exportPdf(){
        logger.info(serviceHeader.getRequestBy());
    }

    //The method that cause issue
    public void nastyExport(){
        serviceHeader = new ServiceHeader();
        serviceHeader.getRequestBy("Admin");
        logger.info(serviceHeader.getRequestBy());
    }
}


/*There is also an Interceptor class that 
get all request headers and assign to the ServiceHeader bean*/

对于调用export()方法的普通请求,ServiceHeader bean中的变量是从请求中正确获取的。

但是,当调用nastyExport()方法时,ServiceHeader将由服务手动初始化。从那时起,如果再次调用export()方法,则serviceHeader.getRequestBy()始终返回nastyExport()方法中设置的最后一个值。

任何人都可以建议为什么发生此问题吗?我没有看到任何地方提到该bean在手动初始化时会自动从Request转换为Singleton范围。

有什么方法可以防止手动初始化的发生吗?

0 个答案:

没有答案