1

我有课程AB以及他们的实现AImplBImpl.

interface A {
}
interface B {
}
interface C {
}
class AImpl{
    @Inject
    AImpl(B b){}
}
class BImpl{
    @Inject
    BImpl(String foo, C c){}
}
class CImpl{
}

要在 Guice 中配置依赖项,我会像这样编写 smt

bind(A.class).to(AImpl);
bind(C.class).to(CImpl);
@Provides B provideB(C c){
   return new BImpl("foo", c)
}

在春天我可以做 smt like

@Bean public A a() {
    return new AImpl(b())
}
@Bean public B b() {
    return new BImpl("foo", c());
}
@Bean public C c() {
    return new CImpl();
}

有几个缺点

  • 我应该写下 AImpl 在 2 个地方(构造函数和配置)需要 B。
  • 我应该编写更多代码(CImp 和 AImpl 需要创建方法而不是一个表达式)

有没有办法在不做 xml 的情况下改进我的 spring 配置?

upd 我也不想用 @Component 之类的 spring 相关注释来污染我的类。我更喜欢构造函数注入而不是任何其他类型的注入。扫描也不是优选的解决方案。那么,我可以用 Guice 的方式做 Spring 吗?

更新2

所以我想要存档

  • 自动装配
  • 构造函数注入

没有

  • XML
  • 路径扫描
4

2 回答 2

2

您可以使用自动装配,而不是使用 java 代码创建 Bean。您可以在您的 java 配置中定义 ComponentScan。您不需要使用任何 XML 文件。

于 2013-03-20T10:02:52.033 回答
0

这可以创建没有 xml 的 bean 并使用 Spring 注释污染 bean:

interface A {
}

interface B {
}

interface C {
}

class AImpl implements A {
    AImpl(B b) {
    }
}

class BImpl implements B {
    BImpl(String foo, C c) {
    }
}

class CImpl implements C {
}

@Configuration
class Config {
    @Bean public A a() {
        return new AImpl(b());
    }

    @Bean public B b() {
        return new BImpl("foo", c());
    }

    @Bean public C c() {
        return new CImpl();
    }
}

public class T1 {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    }
}
于 2013-03-20T10:20:18.343 回答