【问题标题】:Injecting property into a static final field将属性注入静态最终字段
【发布时间】:2015-11-25 08:11:58
【问题描述】:

我有以下处理事件的类:

public abstract class EventExecutor {

    public static final EventExecutor ON_BALANCE_CHANGE_EXECUTOR = new EventExecutor() {

        private BalanceDao balanceDao;

        @Override
        public void executeEvent() {
            BigDecimal balance;
            //getting the balance
            balanceDao.add(balance);
        }

        //GET, SET, others
    };

    public abstract void executeEvent();
}

处理一些事件意味着将一些数据保存到持久存储中。由于我使用 Spring 4,我需要执行相应的依赖注入才能执行db-操作。

目前,我打算允许客户端通过在静态最终字段上调用方法来执行事件处理,以提高代码的可读性。

因此,有可能通过ContextLoader.getCurrentWebApplicationContext().getBean(String beanName) 做到这一点,但它引入了弹簧依赖关系,这不是一个理想的解决方案。

也许有一些弹簧功能允许我们这样做?你不能就此提出任何建议吗?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    由于您手动创建对象,您不能直接在匿名类中注入 bean。可能的解决方案是为 ON_BALANCE_CHANGE_EXECUTOR 创建静态内部类,并在您的配置中定义这种类型的 bean。

    public abstract class EventExecutor {
    public static class OnBalanceChangeExecutor extends EventExecutor {
    
            private BalanceDao balanceDao;
    
            @Override
            public void executeEvent() {
                BigDecimal balance;
                //getting the balance
                balanceDao.add(balance);
            }
    
            //GET, SET, others
        }}
    

    之后,您可以在上下文配置中创建 bean:

    <bean id="onBalanceChangeExecutor" class = "your.package.EventExecutor$OnBalanceChangeExecutor">
    <property name="balanceDao" ref="balanceDao"/>
    </bean>
    

    【讨论】:

    • 您的解决方案看起来不错,但我找到了一个更适合我需要的解决方案。我使用 MethodInvokationFactoryBean。
    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2016-08-28
    相关资源
    最近更新 更多