2010-01-16 3 views
3

J'ai une application qui essaie d'utiliser les dernières conventions de Spring 3 avec des configurations basées sur des annotations, mais j'ai aussi des classes héritées qui utilisent l'injection de constructeurs. Sur la base de la documentation de Spring, vous devez simplement appeler la méthode qui crée cette dépendance et la transmettre au constructeur qui en a besoin. Cela semble fonctionner quand la classe Configuration est améliorée, mais il semblerait que si vous @Import la classe Configuration, elle n'est pas améliorée, elle peut potentiellement injecter des instances non-autowired. Plus précisément, si un de mes référentiels est injecté par un constructeur dans un autre bean et que ce référentiel est défini dans la même classe de configuration que l'autre bean (je sais que les référentiels doivent être dans leur propre classe de configuration), il n'est pas câblé avec un EntityManager injecté.Spring 3 Java Config: Importé @Configuration non amélioré?

Mes haricots:

public class MyBean { 
    private ShouldBeSingleton d; 
    public @Autowired MyBean(ShouldBeSingleton d) { this.d = d; } 
    public ShouldBeSingleton getMyDependency() { return d; } 
} 

public class ShouldBeSingleton { 
} 

Et deux classes configuration comme celle-ci:

@Configuration 
public class MyImportedConfig { 
    @Bean public ShouldBeSingleton mySingleton() { 
     return new ShouldBeSingleton(); 
    }  
    @Bean public MyBean myBean() { 
     return new MyBean(mySingleton()); 
    }  
} 

@Configuration 
@Import({MyImportedConfig.class}) 
public class MyConfig { 
} 

Mes principaux ressemble à ceci:

public static void main(String[] args) { 
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); 
    MyBean bean = context.getBean(MyBean.class); 
    System.out.println("myInjectedSingleton=" + bean.getMyDependency()); 
    System.out.println("mySingleton=" + context.getBean(ShouldBeSingleton.class)); 
} 

Si je charge le MyImportedConfig.class, je obtenir la sortie correcte (ie la classe singleton est la même si j'appelle la méthode depuis MyImportedConfig):

[email protected] 
[email protected] 

Mais, si je change le AnnotationConfigApplicationContext pour charger MyConfig qui importe MyImportedConfig cela se produit:

[email protected] 
[email protected] 

Est-ce comportement attendu? Ma solution de contournement actuelle consiste simplement à déplacer tout ce qui nécessite qu'un EntityManager soit injecté dans une autre classe Configuration, à l'importer, puis à définir une dépendance @Autowired dans la classe Configuration qui doit être injectée par le constructeur. Je charge ceci dans un AnnotationConfigWebApplicationContext et si je spécifie chaque classe de configuration dans contextConfigLocation, alors toutes les classes de configuration sont correctement améliorées, mais cela ne semble pas utiliser la fonctionnalité "modulaire" @Import.

Répondre

1

Alors ... Je suppose que c'est un bug?

Questions connexes