web-dev-qa-db-fra.com

Comment injecter Spring Bean pour la méthode d'usine nécessitant le paramètre MyClass.class

J'essaie d'injecter un bean Java.util.prefs.Preferences dans mon contrôleur maître. Le contrôleur ressemble à:

@Controller
class MyController {
    @Autowired
    private Preferences preferences;
}

Le fichier application-context.xml crée le bean pour Java.util.prefs.Preferences. Il utilise une méthode d'usine, donc j'ai l'entrée suivante pour créer le bean:

<bean id="preferences" class="Java.util.prefs.Preferences" factory-method="userNodeForPackage" />

Preferences.userNodeForPackage (param) prend pour un paramètre la classe liée à la préférence. Dans ce cas, Spring doit créer le bean en effectuant l'appel: 

Preferences.userNodeForPackage(MyController.class);

Comment une classe peut-elle être transmise à un haricot de printemps instancié avec une méthode d'usine? Merci

Informations sur l'environnement:

Java 7
Spring 3.1
16
Austin Haws

Vous pouvez spécifier l'élément constructor-arg

<bean id="preferences" class="Java.util.prefs.Preferences" factory-method="userNodeForPackage">
    <constructor-arg type="Java.lang.Class" value="com.path.MyController" />
</bean>

Ceci est expliqué dans la documentation officielle ici , section 5.4.1.

Les arguments de la méthode fabrique statique sont fournis via éléments, exactement les mêmes que si un constructeur avait effectivement été utilisé. Le type de la classe retournée par le La méthode factory ne doit pas nécessairement être du même type que la classe contient la méthode fabrique statique, bien que ce soit le cas dans cet exemple. Un instance (non statique) méthode d'usine serait utilisé dans un essentiellement mode identique (mis à part l'utilisation de l'attribut factory-bean au lieu de l'attribut class), les détails ne seront donc pas abordés ici.

22

Eh bien, je ne connais pas la méthode de configuration basée sur XML mais je peux vous dire comment vous pouvez l’instancier via la classe Configuration.

@Configuration
public class Config {
    @Bean(name="preferences")
    public Java.util.prefs.Preferences preferences() {
        // init
        return Java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class);
    }
}

P.S. :

Vous devrez ajouter votre classe/package de configuration pour l'analyse, que ce soit dans le fichier web.xml si vous utilisez l'approche complète basée sur les annotations [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] ou dans votre fichier de configuration, comme indiqué ci-dessous:

<context:component-scan base-package="com.comp.prod.conf" />
3
Nandkumar Tekale
 public class Preferences
 {  
     SomeBean someBean;

     public void setSomeBean(SomeBean someBean){
            this.someBean = someBean;
     }  

     public static Preferences createSampleBeanWithIntValue(SomeBean someBean)
     {
         Preferences preferences= new Preferences();
         preferences.setSomeBean(someBean);
         return preferences;
     }
}

  <bean id="someBean" class="Java.util.prefs.SomeBean"/>

 <bean id="preferences" class="Java.util.prefs.Preferences" factory-method="userNodeForPackage" > 

    <constructor-arg ref="someBean "/>       
 </bean>

S'il vous plaît voir la référence

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

2
Prabhakaran

Le framework Spring permet d’injecter le haricot selon la méthode de l’usine. Pour ce faire, nous pouvons utiliser deux attributs d'élément bean.

factory-method: représente la méthode factory qui sera appelée pour injecter le bean . factory-bean: représente la référence du bean par lequel la méthode factory sera appelée. Il est utilisé si la méthode de fabrication est non statique . Une méthode qui renvoie une instance d'une classe est appelée méthode de fabrication.

public class A {  
public static A getA(){//factory method  
    return new A();  
}  
}  
0

commencez par créer le bean de la classe 'Preferences' à l'aide d'un fichier xml ou d'une annotation.
puis vous pouvez utiliser ce <context:annotation-config> si vous avez créé un bean en utilisant la configuration xml pour activer la fonctionnalité d'annotation @Autowired
(ou ) 

<context:component-scan base-package="com.estudo.controller" />
si vous avez créé un haricot en utilisant des annotations.
Remarque: définissez les balises ci-dessus dans le fichier XML servlet de Spring.