gpt4 book ai didi

java - 是否有可能以及如何在 Spring 进行辅助注入(inject)?

转载 作者:IT老高 更新时间:2023-10-28 13:46:21 25 4
gpt4 key购买 nike

在 Guice 2 或 3 中,存在所谓的 Assisted/Partial Inject 描述 here.有了这个,Guice 为我的对象合成工厂实现(实现我的接口(interface)),并且一些构造函数参数由 Guice 注入(inject),一些是从上下文提供的。

是否有可能以及如何用 Spring 做同样的事情?

最佳答案

以下内容完全符合我的要求。虽然,它没有综合工厂的实现,但它已经足够好了,因为工厂可以访问 injection context 以便在期间可以使用其他 beans(可注入(inject)的工件) build 。它使用基于 java 的 @Configuration 而不是 XML,但它也适用于 XML。

工厂界面:

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);
}

//这是显示如何进行辅助注入(inject)的 Spring 配置

@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 所做的。棘手的区别是 Scope。 Spring 的默认范围是 Singleton 而 Guice 的则不是(它是原型(prototype))。

关于java - 是否有可能以及如何在 Spring 进行辅助注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6222460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com