[英]Using Java Spring injection with `public static final` objects (for Jakarta Unstandard)
免责声明 :我理解尝试使用Spring注入静态变量被认为是不好的做法(我知道有很多方法可以解决它,例如这里 )。 所以最终我计划重新设计,但我很好奇可能的解决方案或解决方法。
我正在使用Jakarta的Unstandard标记库(特别是useConstants )来轻松地将public static final
对象public static final
给我的JSP页面。 我希望这些静态对象从我的数据库初始化自己,这意味着我需要注入一个JDBC模板或数据源。 所以我想要这样的东西:
public class MyGroup {
// @Autowire or inject somehow?
private static /*final?*/ NamedParameterJdbcTemplate jdbcTemplate;
public static final MyGroup GROUP_A = new MyGroup("GROUP_A");
public static final MyGroup GROUP_B = new MyGroup("GROUP_B");
public static final MyGroup GROUP_C = new MyGroup("GROUP_C");
// Instance fields
private int id;
private String name;
private String description;
/**
* Construct a group
*/
public MyGroup() {}
/**
* Construct a group using information from the database
* @param key the key to match
*/
public MyGroup(String key) {
// Do DB stuff using injected JDBC template
this.id = id_from_DB;
this.name = name_from_DB;
this.description = desc_from_DB;
}
}
在我的JSP中,我可以简单地执行${MyGroup.GROUP_A.id}
以及Java代码中的其他任何地方,我可以只使用MyGroup.GROUP_B.getName()
。
所以问题是这些组必须是final
的Jakarta库来接收它们,但我不能通过Spring静态初始化它们。 思考?
对于spring而言,这不是一个问题,就像你想要的东西和java允许的东西之间的冲突一样。 您无法延迟静态最终属性的分配。 必须在加载类时设置它。 因此,到春天可以注入时,为时已晚。
如果你不必将它作为最终版,你可以打开一些选项。
另一种可能性是,可以在拦截属性的访问权限时创建方面,并返回所需的值而不是存储的值。 然后,您可以将所需的值注入方面。
我从来没有专门用静态属性做过,但我认为它是可能的。 不可能将常量字段(绑定到常量字符串对象或原始值的静态最终字段)用作JoinPoint,因为java要求内联,但由于您指向非String对象,我认为使用方面可以工作。
为了确保弹簧注入您的方面,请确保通过以下方式告诉弹簧:
<bean id="someId" class="com.yourdomain.YourAspect" factory-method="aspectOf"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.