Enregistrement du bean fonctionnel Spring 5

Enregistrement du bean fonctionnel Spring 5

1. Vue d'ensemble

Spring 5 prend en charge l'enregistrement des beans fonctionnels dans le contexte de l'application.

En termes simples,this can be done through overloaded versions of a new registerBean() method défini dans la classeGenericApplicationContext.

Jetons un coup d'œil à quelques exemples de cette fonctionnalité en action.

2. Dépendances deMaven

Le moyen le plus rapide de configurer un projetSpring 5 est d'utiliserSpring Boot en ajoutant la dépendancespring-boot-starter-parent auxpom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    2.0.0.RELEASE

Nous avons également besoin desspring-boot-starter-web etspring-boot-starter-test pour notre exemple, pour utiliser un contexte d'application Web dans un testJUnit:


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-test
    test

Bien sûr,Spring Boot n'est pas nécessaire pour utiliser la nouvelle manière fonctionnelle d'enregistrer un bean. Nous pourrions aussi simplement ajouter directement la dépendancespring-core:


    org.springframework
    spring-core
    5.0.2.RELEASE

3. Enregistrement fonctionnel des haricots

The registerBean() API can receive two types of functional interfaces as parameters:

  • a Supplier argument utilisé pour créer l'objet

  • a BeanDefinitionCustomizer vararg qui peut être utilisé pour fournir une ou plusieurs expressions lambda pour personnaliser lesBeanDefinition; cette interface a une seule méthodecustomize()

Tout d'abord, créons une définition de classe très simple que nous utiliserons pour créer des beans:

public class MyService {
    public int getRandomNumber() {
        return new Random().nextInt(10);
    }
}

Ajoutons également une classe@SpringBootApplication que nous pouvons utiliser pour exécuter un testJUnit:

@SpringBootApplication
public class Spring5Application {
    public static void main(String[] args) {
        SpringApplication.run(Spring5Application.class, args);
    }
}

Ensuite, nous pouvons configurer notre classe de test en utilisant l'annotation@SpringBootTest pour créer une instanceGenericWebApplicationContext:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Spring5Application.class)
public class BeanRegistrationIntegrationTest {
    @Autowired
    private GenericWebApplicationContext context;

    //...
}

Nous utilisons le typeGenericWebApplicationContext dans notre exemple, mais tout type de contexte d'application peut être utilisé de la même manière pour enregistrer un bean.

Voyons commentwe can register a bean using a lambda expression for creating the instance:

context.registerBean(MyService.class, () -> new MyService());

Vérifions que nous pouvons maintenant récupérer le bean et l'utiliser:

MyService myService = (MyService) context.getBean("com.example.functional.MyService");

assertTrue(myService.getRandomNumber() < 10);

Nous pouvons voir dans cet exemple que si le nom du bean n’est pas explicitement défini, il sera déterminé à partir du nom en minuscules de la classe. La même méthode ci-dessus peut également être utilisée avec un nom de bean explicite:

context.registerBean("mySecondService", MyService.class, () -> new MyService());

Voyons ensuite commentwe can register a bean by adding a lambda expression to customize it:

context.registerBean("myCallbackService", MyService.class,
  () -> new MyService(), bd -> bd.setAutowireCandidate(false));

Cet argument est un callback que nous pouvons utiliser pour définir des propriétés de bean telles que l'indicateurautowire-candidate ou l'indicateurprimary.

4. Conclusion

Dans ce rapide tutoriel, nous avons vu comment nous pouvons utiliser la méthode fonctionnelle d'enregistrement d'un bean.

Le code source de l'exemple peut être trouvéover on GitHub.