Java 使用spring注入指定私有静态最终字段成员
是否有可能完成这样的任务。此处处理的是Java 使用spring注入指定私有静态最终字段成员,java,spring,Java,Spring,是否有可能完成这样的任务。此处处理的是私有静态字段成员,但在这种情况下没有帮助,因为无法分配最终成员 使用private static final作为成员限定符的理由: 数据成员是ServiceClient,因此将其附加到类型是有意义的,因为它不依赖于实例。它也是线程安全的,因此它将提高性能,因为我不会为每个实例初始化客户端 服务客户机本身是一个bean,具有单例作用域。因此,实际上只有一个例子。因为总是会有一个实例,所以允许重新分配是没有意义的 由于此客户端只能由此类的方法使用,因此它是私有
私有静态
字段成员,但在这种情况下没有帮助,因为无法分配最终成员
使用private static final
作为成员限定符的理由:
- 数据成员是ServiceClient,因此将其附加到类型是有意义的,因为它不依赖于实例。它也是线程安全的,因此它将提高性能,因为我不会为每个实例初始化客户端
- 服务客户机本身是一个bean,具有单例作用域。因此,实际上只有一个例子。因为总是会有一个实例,所以允许重新分配是没有意义的
- 由于此客户端只能由此类的方法使用,因此它是私有的
我不确定这是否是反模式,但如果是,那么我的理由是否有资格使用它?如果是的话,那怎么做呢。如果没有,那么请建议一个替代方案(我仍然有兴趣知道如何实现这一点,只是为了了解情况)。您试图做的根本不可能 最根本的原因是Java将代码中出现的
静态final
变量替换为实际值(因为它在编译时是已知的)。检查,以便回答更多细节
即使您不使用final
,Spring仍然不允许您直接将值注入静态
变量。您必须使用如下设置器:
@Value("${my.name}")
public void setPrivateName(String privateName) {
Sample.name = privateName;
}
查看SO answer以了解更多信息。如果您没有当场或在构造函数中初始化
final
成员,则不能将其标记为final-抱歉,这是Java编程语言设计。类似的情况是CDI注入,其中注入的字段通常是包私有的(也不是最终的),以使单元测试的注入成为可能,而不使用setter。您可以使用类上的反射以及该字段的字段
类本身上的反射来删除其最终
修饰符。检查一下本质。备选方案(考虑到我用作理由的约束条件)?稍后我会再与您联系