繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM