0

如果我有两个类,例如:

Class A {
     public String importantValue = "stringvalue";

     @Autowire
     public B b;
}

@Component
@Scope("prototype");
Class B {
     // This should be set automatically
     // from IOC Container upon injection.
     public String importantValueFromA;
}

这甚至可能吗?一旦 B 类被注入到 A 中,它应该自动设置 B 中的值。

4

3 回答 3

5

你想让班级A对注入的班级做一些设置B吗?这很简单:

@Service
class A {
    private String importantValue = "stringvalue";

    @Autowire
    private B b;

    @PostConstruct
    public void initB() {
        b.importantValueFromA = this.importantValue;
    }
}

显然你不能b.importantValueFromAA.A构造函数中访问,因为注入还没有发生。但是@PostConstruct回调保证在注入后被调用。

另一种方法是使用 setter 注入,但感觉有点 hacky:

private B b;

@Autowire
public void setB(B b) {
    this.b = b;
    b.importantValueFromA = this.importantValue;
}

两个建议:

  • 保留您的字段private并使用设置器/方法来访问它们。
  • 将原型作用域 bean 注入单例 bean 可能会产生一些意想不到的结果。可以说只B创建一个实例。
于 2012-08-19T14:40:24.420 回答
0

不。B 在 A 之前创建(因为 A 依赖于 B)所以它不会更新值本身。您必须使用构造函数注入:

Class A {
     public String importantValue = "stringvalue";

     @Autowire
     public A(B b) {
          b.importantValueFromA = this.importantValue;
     }
}
于 2012-08-19T14:39:49.097 回答
0

做这样的事情怎么样:

将您的 B 类声明为范围代理,其底层将向 A 公开代理而不是真正的 B,并将尊重原型范围。

@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
class B {

然后您可以通过这种方式在 B 中注入 A 的属性:

@Value("#{a.importantValue}")
private String importantValueFromA;

这是一个完整的工作示例:

https://gist.github.com/3395329

于 2012-08-19T15:00:52.430 回答