【问题标题】:Using Java Spring injection with `public static final` objects (for Jakarta Unstandard)使用带有`public static final`对象的Java Spring注入(对于Jakarta Unstandard)
【发布时间】: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”),也许你可以提供一个例子?
  • @Rembo 不,不是真的。在这一点上,它只是一个好奇心。我有一个 Spring 管理的 JDBC 模板 bean,用于数据库访问,但没有其他限制。

标签: java spring jsp spring-mvc static


【解决方案1】:

这不是 spring 的问题,而是你想要的和 java 允许的之间的冲突。您不能延迟静态最终属性的分配。它必须在加载类时设置。因此,等到春天可以注入时,为时已晚。

如果您不必将其设置为最终版本,则可以打开一些选项。

另一种可能性是在拦截属性的访问时可能会创建一个方面,并返回您想要的值而不是存储的值。然后,您可以将所需的值注入方面。

我以前从未专门针对静态属性做过,但我认为这是可能的。不可能使用常量字段(绑定到常量字符串对象或原始值的静态最终字段)作为 JoinPoint,因为 java 需要内联这些字段,但是由于您指向非字符串对象,我认为使用方面可以工作。

为了确保 spring 注入到你的方面,确保你通过类似这样的方式告诉 spring:

<bean id="someId" class="com.yourdomain.YourAspect" factory-method="aspectOf"/>

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 2011-07-02
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多