调用Spring服务并通过构造函数发送参数

时间:2019-11-08 18:54:44

标签: java spring spring-boot spring-mvc

我有这个简单的Spring服务:

@Service
public class BinCountryCheckFilterImpl {

    @Autowired
    private RiskFilterService riskFilterService;

    private Terminals terminal;    

    @Autowired
    public BinCountryCheckFilterImpl(Terminals terminal) {  
        this.terminal = terminal;
    }
}

Terminals是每个收到的请求唯一的对象。此外,binCountryCheckFilter对于每个请求都应该是唯一的-它应该检查数据以了解某些业务状况。

我想从这里致电服务

@Service
public class FilterProcessing {

    @Autowired
    private BinCountryCheckFilterImpl binCountryCheckFilter; 

    public Response someMetohd(Terminals terminal,
              Transaction message, HttpServletRequest request) throws JAXBException, JsonProcessingException {

        switch(.......) {
            case ".......":
                // send here the args via Contructor
                binCountryCheckFilter.validateBinCountryCheckFilter(terminal);                  
                break;
            case ".........":           
                .........
                break;

                break;                                          
            }           
        }
        return null;
    }
}

但是我不知道如何通过terminal构造函数发送对象BinCountryCheckFilterImpl。 有解决方案吗?

1 个答案:

答案 0 :(得分:0)

构造函数用于创建对象。 您说:“通过构造函数在此处发送args”-但这意味着您应该为每个请求创建类型为public static IServiceCollection AddRange(this IServiceCollection current, IServiceCollection main) { if(current == null) { throw ArgumentNullException(); } foreach (var serv in main) { current.Add(serv); } return current; } 的新对象,而这并不是该类的定义方式。

在您的情况下,BinCountryCheckerFilterImpl是具有(默认)作用域单例的bean,这意味着在应用程序上下文中仅存在此类的一个实例。

因此,不要在构造函数中使用参数,只需将BinCountryCheckFilterImpl对象(根据请求创建)传递给验证方法即可:

Terminals

如果确实必须将@Service public class BinCountryCheckFilterImpl { @Autowired private RiskFilterService riskFilterService; public void validateBinCountryCheckFilter(Terminals terminal) { } } 定义为原型,则应注意不能通过简单的自动装配将原型注入单例。

对此有很多技巧,您可以找到答案here。我没有在答案中描述它们,因为我认为它超出了问题的范围,您应该真正使用上面提供的解决方案。