免责声明:我知道尝试使用Spring注入静态变量被认为是不好的做法(我知道有很多方法,例如here)。所以最终我计划重新设计,但我对可能的解决方案或解决方法感到好奇。
我正在使用Jakarta的Unstandard标记库(特别是useConstants)来轻松地将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静态初始化它们。想法?
答案 0 :(得分:2)
这不是春天的问题,而是你想要什么和java允许之间的冲突。您无法延迟静态最终属性的分配。必须在加载类时设置它。因此,到春天可以注入时,为时已晚。
如果你不必将它作为最终版,你可以打开一些选项。
另一种可能性是,可以在拦截属性的访问权限时创建方面,并返回所需的值而不是存储的值。然后,您可以将所需的值注入方面。
我从来没有专门使用静态属性,但我认为它是可能的。不可能将常量字段(绑定到常量字符串对象或原始值的静态最终字段)用作JoinPoint,因为java要求内联,但由于您指向非String对象,我认为使用方面可以工作。
为了确保弹簧注入您的方位,请确保通过以下方式告诉弹簧:
<bean id="someId" class="com.yourdomain.YourAspect" factory-method="aspectOf"/>