2010-12-15 340 views
2

Je vais avoir du mal à mettre tous ensemble:Comment injecter des paramètres de constructeur à partir de propriétés dans Spring 3.0 avec l'annotation @Named?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd"> 
    <context:property-placeholder location="classpath:some-useful.properties"/> 
    <context:component-scan base-package="scan.me.scotty"/> 
</beans> 

principal est la suivante:

@Named 
@Singleton 
public class MySpringMain { 
    @Inject 
    public MySpringMain(final AReallyCool component) { 
     component.runForAWhile(); 
    } 

    public static void main(final String... args) { 
     new ClassPathXmlApplicationContext(args); 
    } 
} 

Component est la suivante:

@Named 
public class AReallyCool { 
    @Inject 
    public AReallyCool(@Named("whoAmI") final String whoAmI) { 
     // do something here 
    } 
} 

Et propriétés est:

whoAmI=Who is anyone, really? 

naturellement (pour moi) printemps meurt la mort:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Named(value=whoAmI)} 

Questions:

  • Est-ce même une approche raisonnable? J'essaie d'éviter les annotations spécifiques à Spring.
  • Comment feriez-vous ce travail?

Répondre

4

Un couple d'exemples spécifiques de Spring peut aider. Comme toujours, la documentation au http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html est très utile.

Pour lire un fichier de propriétés, recherchez l'annotation @Value. Exemple:

@Component 
@Scope("prototype") 
@ImportResource("classpath:spring/app-config.xml") 
public class RancidService { 

    private String filepath; 
    private String filename; 

    /** 
    * Default constructor 
    * 
    * @param pathname 
    */ 
    @Autowired 
    public RancidService(@Value("#{ nccProperties['rancid.path']}") String filepath) { 

     this.filepath = filepath; 
    } 

Voici un exemple d'une fonction principale @Autowired dans

@Component 
public class GetCurrentMetric { 


    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/app-config.xml"); 

     GetCurrentMetric p = context.getBean(GetCurrentMetric.class); 
     p.start(args); 

    } 

    @Autowired 
    private WhipService service; 
    private void start(String[] args) { 

     if (args.length != 2) { 
      System.out.println("Usage: GetCurrentMetric <device> <interface> Example: GetCurrentMetric cr1.lax1 p9/2"); 
     } else { 
      String device = args[0]; 
      String iface = args[1]; 

      Map<String, String> map = service.getCurrentMetric(device, iface); 

      if (map.size() == 2) { 
       System.out.println("Level: " + map.get("level")); 
       System.out.println("Metric: " + map.get("metric")); 
      } 
     } 
    } 

} 

EDIT: Manqué une chose importante, pour le fichier de propriétés par exemple en haut, vous aurez besoin de quelque chose dans votre application fichier de contexte pour l'attacher ensemble. Exemple pour ci-dessus:

<!-- define the properties file to use --> 
<util:properties id="nccProperties" location="classpath:spring/ncc.properties" /> 
+0

la réponse est trop longue. Vous pourriez simplement spécifier qu'il devrait utiliser 'Value' au lieu de' Named'. +1 de toute façon. Mais débarrassez-vous de '@ ImportResource'. Ce n'est pas nécessaire, et il est supposé être utilisé principalement avec les classes '@ Configuration'. – Bozho

+0

Cela fonctionne très bien avec @Value. Je suis à la recherche d'une solution avec @Named. – binkley

+0

@Bozho Je suis en désaccord sur la longueur, j'ai toujours trouvé des exemples utiles. Merci cependant avec le commentaire sur @ImportResource, point bien pris. – Bill