【发布时间】:2014-06-06 23:56:35
【问题描述】:
免责声明:我知道尝试使用 Spring 注入静态变量被认为是不好的做法(我知道有一些方法可以绕过它,例如 here)。所以最终我计划重新设计,但对可能的解决方案或变通方法感到好奇。
我正在使用 Jakarta 的非标准标记库(尤其是 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 静态初始化它们。想法?
【问题讨论】:
-
检查这个答案:stackoverflow.com/questions/11392692/….. 不是被接受的..
-
谢谢@mserioli。我认为
factory-method方法行不通,因为这些静态对象必须是final。第二种方法对我来说太模糊了(“在静态初始化块中从 Spring 上下文加载 bean”),也许你可以提供一个例子? -
检查这个答案:) : stackoverflow.com/questions/11324372/…
-
@Rembo 不,不是真的。在这一点上,它只是一个好奇心。我有一个 Spring 管理的 JDBC 模板 bean,用于数据库访问,但没有其他限制。
标签: java spring jsp spring-mvc static