Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否存在强制在注入组件中设置属性的模式?_Java_Design Patterns - Fatal编程技术网

Java 是否存在强制在注入组件中设置属性的模式?

Java 是否存在强制在注入组件中设置属性的模式?,java,design-patterns,Java,Design Patterns,我想知道是否有一种模式会强制组件的用户在自动连接后设置属性。例如,我有: @SpringComponent @PrototypeScope public class MyAutowiredClass { private String myVariabeThatTheUserShouldSet; public MyAutowiredClass(someOtherStuff ...(not my StringVariable)){ } } 在本例中,如何强制从该组件的

我想知道是否有一种模式会强制组件的用户在自动连接后设置属性。例如,我有:

@SpringComponent
@PrototypeScope
public class MyAutowiredClass {

    private String myVariabeThatTheUserShouldSet;

    public MyAutowiredClass(someOtherStuff ...(not my StringVariable)){

    }
}

在本例中,如何强制从该组件的用户处设置MyVariableAttheUsers?

这有点复杂。如果不是在spring上下文中,您可以将该变量添加到构造函数中,并使其成为必需的。因此,为了在Spring环境中实现这一点,我建议如下:

如果可能,将该值作为依赖项注入的一部分传递,而不是试图绕过它。我理解这是一种动态的东西,但通常它还是有商业意义的,而且有办法做到这一点。例如,如果您想要当前用户的电子邮件,您可以添加一些检索该值的服务,并将该服务传递给您的组件,然后从中提取该值。或者,如果你想要一些公司的配置,你可以添加一个服务,让你的价值等。这是春天的方式,我会倾向于这一点

一个更简单的解决方案是将该必填字段添加到实际需要它的方法的方法签名中。它将通过一个字段重载签名,但会强制用户传递一个值。如果您需要该字段用于几个方法,而不是用于组件的正确工作,那么它将是最容易实现/理解的解决方案

为该值添加一个setter,如果未设置,则引发异常。但这会更糟糕,因为如果检查了异常,则需要try/catch,如果不是,人们会忘记设置字段,因此我会避免使用该解决方案


这看起来像是设计的味道。至少确保您的组件范围不是singleton是的,spring中的默认范围是singleton;这是一个例子,在我的真实代码中,它的原型范围是有限的,也许我应该添加一个好的捕获:听起来像一个。