使用带有`public static final`对象的Java Spring注入(用于Jakarta Unstandard)

时间:2014-04-22 14:29:46

标签: java spring jsp spring-mvc static

免责声明:我知道尝试使用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静态初始化它们。想法?

1 个答案:

答案 0 :(得分:2)

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

如果你不必将它作为最终版,你可以打开一些选项。

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

我从来没有专门使用静态属性,但我认为它是可能的。不可能将常量字段(绑定到常量字符串对象或原始值的静态最终字段)用作JoinPoint,因为java要求内联,但由于您指向非String对象,我认为使用方面可以工作。

为了确保弹簧注入您的方位,请确保通过以下方式告诉弹簧:

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