有没有可能以及如何在春季进行辅助注射?

2022-09-03 13:46:30

在 Guice 2 或 3 中,存在此处描述的所谓的辅助/部分注入有了这个,Guice为我的对象合成了工厂实现(实现我的接口),一些构造函数参数由Guice注入,一些是从上下文中提供的。

有没有可能以及如何用春天做同样的事情?


答案 1

以下内容完全符合我的要求。虽然它没有合成工厂的实现,但它已经足够好了,因为工厂可以访问注入上下文,以便在构建过程中可以使用其他bean(可注入工件)。它使用基于java而不是XML,但它也可以与XML一起使用。@Configuration

工厂接口:

public interface Robot {

}

// Implementation of this is to be injected by the IoC in the Robot instances
public interface Brain {
    String think();
}

public class RobotImpl implements Robot {

    private final String name_;
    private final Brain brain_;

    @Inject
    public RobotImpl(String name, Brain brain) {
        name_ = name;
        brain_ = brain;
    }

    public String toString() {
        return "RobotImpl [name_=" + name_ + "] thinks about " + brain_.think();
    }
}

public class RobotBrain implements Brain {
    public String think() {
        return "an idea";
    }
}


// The assisted factory type
public interface RobotFactory {
    Robot newRobot(String name);
}

这是显示如何进行辅助注射的弹簧配置

@Configuration
class RobotConfig {

    @Bean @Scope(SCOPE_PROTOTYPE)
    public RobotFactory robotFactory() {
        return new RobotFactory() {

            @Override
            public Robot newRobot(String name) {
                return new RobotImpl(name, r2dxBrain());
            }
        };
    }

    @Bean @Scope(SCOPE_PROTOTYPE)
    public Brain r2dxBrain() {
        return new RobotBrain();
    }
}

测试代码:

public class RobotTest {

    @Test
    public void t1() throws Exception {
        ApplicationContext ctx = new 
                           AnnotationConfigApplicationContext(RobotConfig.class);
        RobotFactory rf = ctx.getBean(RobotFactory.class);
        assertThat(rf.newRobot("R2D2").toString(), 
           equalTo("RobotImpl [name_=R2D2] thins about an idea"));
    }

}

这完全实现了Guice所做的。棘手的区别是 .Spring的默认范围是,Guice不是(它是原型)。ScopeSingleton


答案 2

AFAIK你不能。在Spring中,您可以使用静态工厂方法进行实例化,或使用实例工厂方法进行实例化。使用第二个选项,您可以将一个 Bean 定义为另一个 Bean 的工厂。您还可以通过使用将构造参数传递给(例如,请参阅此博客上的使用实例工厂方法部分),这为您提供了 Guice 注入的参数的等效项。但是,我不知道在调用工厂方法时,有任何方法可以从上下文中提供进一步的参数。myFactoryBeanmyFactoryBeanconstructor-arg


推荐