Конфигурация Java в среде Spring

У меня есть классы A, B и их реализация AImpl, BImpl.

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 как

@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 требует B в 2 местах (конструктор и конфиг).
  • Я должен написать больше кода (CImp и AImpl требуют создания метода вместо одного выражения)

Есть ли способ улучшить мою конфигурацию spring без выполнения xml?

upd Я также не хочу загрязнять свои классы аннотациями, связанными с Spring, такими как @Component. И я бы предпочел инъекцию конструктора любым другим инъекциям. Сканирование также не является предпочтительным решением. Итак, могу ли я сделать Spring в стиле Guice?

upd2

Итак Я хочу архив

  • Автопроводка
  • Внедрение конструктора

Без

  • XML
  • Сканирование пути

person Stan Kurilin    schedule 20.03.2013    source источник


Ответы (2)


Вместо создания Bean с использованием кода Java вы можете использовать Autowiring. Вы можете определить ComponentScan в своей конфигурации Java. Вам не нужно использовать какой-либо файл XML.

person Bhushan Bhangale    schedule 20.03.2013
comment
Могу ли я сделать автопроводку без сканирования и xml в Spring? - person Stan Kurilin; 20.03.2013
comment
Я не встречал такого решения. Автосвязывание выполняется контейнером Spring на основе того, какие пакеты вы определяете в ComponentScan, и выполняется один раз во время инициализации. Не уверен, какую проблему вы пытаетесь решить, избегая этого. - person Bhushan Bhangale; 20.03.2013
comment
Мне кажется сложным проводить тестирование, когда представлен компонентный сканер. Кроме того, мне это кажется плохой практикой. - person Stan Kurilin; 20.03.2013
comment
Spring предоставляет отличную тестовую среду. Я никогда не сталкивался с какой-либо проблемой. Если вы можете выделить конкретную проблему, я могу попытаться помочь. Я считаю, что ComponentScan очень помогает, так как в противном случае вам нужно написать или изменить код для создания новых bean-компонентов и управления зависимостями. Его гибкий, а также. - person Bhushan Bhangale; 20.03.2013

Это создает bean-компоненты в порядке без xml и загрязняющие bean-компоненты с аннотацией Spring:

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);
    }
}
person Evgeniy Dorofeev    schedule 20.03.2013
comment
Вот как это работает сейчас. Но как я могу автоматически подключить B к AImpl? - person Stan Kurilin; 20.03.2013