Java 链或责任中bean链执行的动态集

Java 链或责任中bean链执行的动态集,java,Java,我正在实施执行某些行动的责任链。从高层来看,有服务,每个服务中都有执行的操作链。目前,我有一组操作bean,在服务运行时执行。我想知道是否有任何方法可以利用map来实现这一点,并且仍然执行自动注入。如果产品在应用程序生命周期中设置一次,则可以使用spring配置文件。为产品1和产品2创建单独的概要文件,并使用@Profile annotation注释您的服务类。在这种情况下,您可以为每个配置文件使用不同的值填充操作列表 若产品可以在运行时动态更改,那个么可以通过实现InitializngBean

我正在实施执行某些行动的责任链。从高层来看,有服务,每个服务中都有执行的操作链。目前,我有一组操作bean,在服务运行时执行。我想知道是否有任何方法可以利用map来实现这一点,并且仍然执行自动注入。

如果产品在应用程序生命周期中设置一次,则可以使用spring配置文件。为产品1和产品2创建单独的概要文件,并使用@Profile annotation注释您的服务类。在这种情况下,您可以为每个配置文件使用不同的值填充操作列表

若产品可以在运行时动态更改,那个么可以通过实现InitializngBean和BeanNameWare接口来声明产品bean。 BeanNameware让您检查配置是针对产品1还是产品2,而InitializingBean则让您有机会根据bean名称以不同的方式设置列表

在ActionBeans 1、2、3得到的地方是否可以实现灵活性 如果是产品1,则添加到ServiceA执行链中,但仅限于 操作bean 1,3被添加到ServiceA执行的链中,如果它是 产品2

这种方法的主要问题是,自动连接发生在应用程序启动时,而不是在服务上调用execute时。如果需要在运行时处理这两种类型,则需要自动关联所有操作

为了避免服务类中的脆性if/else,您可以将决定哪些操作应用于产品的责任转移到操作本身中

大概是这样的:

    public enum ProductType {
    PROD1, PROD2
}

public interface Product {
    public ProductType getType();
}

public interface Action {
    public boolean execute(Product p);
    public ProductType[] supportedTypes();
}

@Component
@Order(1)
public class Action1 implements Action {
    public boolean execute(Product p) {
        // do stuff
    }

    public ProductType[] supportedTypes() {
        return ProductType.values();
    }
}

@Component
@Order(2)
public class Action2 implements Action {
    public boolean execute(Product p) {
        // do stuff
    }

    public ProductType[] supportedTypes() {
        return new ProductType[] {PROD2};
    }
}

@Service
public class ServiceA {

    private Map<ProductType, List<Action>> actionMap = new HashMap<>();

    @Override
    public boolean execute(Product product) {
        List<Action> actions = actionMap.get(product.getType());
        // call each action
    }

    @Autowired
    public void setActions(List<Action> actions) {

        for (Action action : actions) {
            for (ProductType type : action.supportedTypes()) {
                if (!actionMap.containsKey(type)) {
                    actionMap.put(type, new ArrayList<>());
                }
                actionMap.get(type).add(action);
            }
        }
    }
}

我想你对自动布线的期望很高。在这种情况下,我会用一个配置文件来补充自动连接,它实际上是在代码注释中遵循静态配置的情况。使用SpringBeans xml文件将特定上下文的自定义链放在一起。好的是,XML文件中没有连接的所有内容都可以从注释中自动连接。Spring非常善于让你混合隐喻。

谢谢你的建议。在这种情况下,使用@Profile为不同产品的服务进行注释将不起作用,因为服务定义在spring integration中是一个静态流,但其下的action beans链需要根据产品动态确定。我会研究你建议的第二个选择。我喜欢你的建议!上面,结合限定符的使用帮助我做我想做的事情。