2013-03-20 2 views
1

J'ai les classes A, B et leur implémentation AImpl, BImpl.Configuration Java dans Spring framework

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

Pour configurer les dépendances dans Guice Je voudrais écrire smt comme

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

Au printemps, je peux faire smt comme

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

Il y a plusieurs inconvénients

  • je devrais écrire que AImpl a besoin de B à 2 endroits (contre tructor et config).
  • Je devrais écrire plus de code (PSEC et AImpl exige la création de la méthode au lieu d'une expression)

Existe-t-il un moyen de impruve ma configuration de printemps sans faire? Xml

upd Je ne veux pas poluer mes classes avec des annotations liées au printemps comme @Component. Et je préférerais l'injection de constructeur à n'importe quel type d'autres injections. La numérisation n'est pas une solution préférable aussi. Alors, je peux faire le printemps à Guice?

UPD2

Alors Je veux archives

  • Autowiring
  • Constructor injection

Sans

  • XML
  • PathScan

Répondre

2

Au lieu de créer Bean en utilisant le code java, vous pouvez utiliser Autowiring. Vous pouvez définir ComponentScan dans votre configuration java. Vous n'avez pas besoin d'utiliser un fichier XML.

+0

puis-je faire Autowiring sans scaning et xml au printemps? –

+0

Je n'ai pas rencontré une telle solution. L'autowiring est fait par le conteneur Spring en fonction des paquets que vous définissez dans ComponentScan et c'est fait une fois au moment de l'initialisation. Vous ne savez pas quel problème vous essayez de résoudre en évitant cela. –

+0

Il me semble fastidieux de faire des tests quand componentScan se présente. A part ça, ça me semble être une mauvaise pratique. –

0

Cela crée des haricots OK sans xml et les haricots avec annotations polluantes de printemps:

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

Voici comment cela fonctionne maintenant. Mais comment puis-je autoowire 'B' dans' AImpl'? –

Questions connexes