web-dev-qa-db-fra.com

Comment créer un haricot en utilisant @Bean dans Spring Boot pour une classe abstraite

J'ai l'obligation de migrer un projet de printemps de style ancien vers une botte de printemps. Supposons que l'extrait de code ci-dessous soit transféré au style de démarrage Spring.

Voici ma demande, comment convertir ci-dessous abstract bean en @Bean? 

<bean id="sample" class="com.test.core.common.AbstractClass" abstract="true">
    <property name="sample1" ref="sample1" />
     <property name="sample2" ref="sample2" />
</bean>
11
spandey15

Ecrivez votre classe de base abstraite en langage Java pur (sans couplage Spring):

public abstract class AbstractClass{   
    private Sample1 sample1;
    private Sample2 sample2;

    public AbstractClass(Sample1 sample1, Sample1 sample2){
       this.sample1 = sample1;
       this.sample2 = sample2;
   }
   ... 
}

Notez que l'ajout d'un constructeur avec des paramètres (à la fois pour la classe abstraite et la classe concrète) facilite l'injection et clarifie les dépendances.

Ensuite, vous avez deux moyens:

1) Annotez la ou les classes concrètes avec @Component.
Tel que : 

@Component
public class MyClass extends AbstractClass{   
    public MyClass (Sample1 sample1, Sample1 sample2){
        super(sample1, sample2);
    }
}

Cette première méthode a l'avantage d'être courte: il suffit d'ajouter une annotation.
Mais cela fait de facto la sous-classe un bean potentiellement chargé par le contexte Spring.

2) Vous pouvez également déclarer le haricot dans une classe Configuration.
Tel que :

@Configuration
public class MyConfig{
  @Bean
   public MyClass myClass(Sample1 sample1, Sample1 sample2){
      return new MyClass(sample1, sample1);
   }
}

Cette deuxième méthode est plus détaillée mais présente l’avantage de ne pas modifier le code de la sous-classe et d’autoriser les clients de la classe à décider si la classe doit être un bean.

Chaque approche a ses avantages et ses inconvénients.
Donc, à utiliser selon l'exigence concrète.

13
davidxxx

Il n'est pas nécessaire de convertir ce code. Vous devez uniquement déclarer les classes qui étendent com.test.core.common.AbstractClass en tant que beans gérés par Spring en les annotant avec @Component ou @Service ou en déclarant une méthode annotée avec @Bean dans votre classe de configuration.

Généralement, "abstract bean" n’est pas nécessaire dans Java Configuration, il n’existe même pas d’équivalent. Cela était nécessaire dans la configuration xml pour l'héritage des paramètres, ce qui est maintenant réalisable avec des méthodes Java simples. Trouvez exemple de Stephane Nicoll qui est développeur de Spring Core.

2
Oleksandr Shpota

Comme Java possède son propre mécanisme de classes abstraites et d'héritage, vous n'avez pas besoin de coupler le code suivant dans votre couplage de ressort.

<bean id="sample" class="com.test.core.common.AbstractClass" abstract="true">
    <property name="sample1" ref="sample1" />
     <property name="sample2" ref="sample2" />
</bean>

Dans la configuration XML, vous deviez faire cela pour spécifier le modèle d'héritage des beans enfant. Mais comme Springboot utilise la configuration Java, cette partie est traitée directement avec l'héritage Java.

Cela signifie que vous pouvez déclarer cette classe abstraite en tant que classe abstraite Java normale et traiter uniquement les classes enfants en tant que beans sans vous soucier de la classe parent abstraite.

0
tryingToLearn