java - 是否有强制在注入组件中设置属性的模式?
问题描述
我想知道是否有一种模式强制我的组件的用户在自动装配后设置一个属性。例如我有这个:
@SpringComponent
@PrototypeScope
public class MyAutowiredClass {
private String myVariabeThatTheUserShouldSet;
public MyAutowiredClass(someOtherStuff ...(not my StringVariable)){
}
}
在此示例中,我如何强制从该组件的用户设置 myVariabeThatTheUserShouldSet?
解决方案
嗯,这有点复杂。如果它不在 spring 上下文中,您可以将该变量添加到构造函数中并使其像那样“必需”。因此,为了在 Spring 上下文中实现这一点,我建议如下:
如果可能,将该值作为依赖注入的一部分传递,而不是尝试解决它。我知道这是动态的,但通常它仍然具有商业意义,并且有办法做到这一点。例如,如果您想要当前用户的电子邮件,您可以添加一些服务来检索该值并将该服务传递给您的组件并从那里提取该值。或者,如果您想要一些公司配置,您可以添加一个为您提供该价值的服务等。这是“春天”的方式,我倾向于这样做。
一个更简单的解决方案是将该必填字段添加到实际需要它的方法的方法签名中。它会使签名超载一个字段,但会强制用户传递一个值。如果您需要该字段用于几个方法而不是组件的正确工作,那么这将是最容易实现/理解的解决方案。
为该值添加一个设置器,如果未设置,则抛出异常。不过那会更糟,因为如果检查了异常,则需要尝试/捕获,如果不是,人们会忘记设置该字段,所以我会避免使用该解决方案。
推荐阅读
- html - Scale posts to screen size [div too big for screen]
- c# - Unity How to play two videos synchronously
- generics - 如何实现通用切片附加器?
- javascript - 如何根据 JavaScript 对象中的状态值过滤记录?
- ios - How to show time day difference compared to current date?
- biztalk - Unable to cast object of type ‘Microsoft.BizTalk.Administration.EdiExt.ComboItem’ to type ‘System.String’ error in BizTalk Server
- linux - Vulkan memoryHeaps 及其 memoryTypes
- angular - 找不到Angular 6符号链接模块
- python - CalledProcessError 使用 eventlet 越过 try 块
- mysql - 如何在mysql中获取周末天数?