Spring 5 Funktionelle Bean-Registrierung

Spring 5 Functional Bean Registration

1. Überblick

Spring 5 unterstützt die funktionale Bean-Registrierung im Anwendungskontext.

Einfach ausgedrückt,this can be done through overloaded versions of a new registerBean() methodist in der KlasseGenericApplicationContextdefiniert.

Schauen wir uns einige Beispiele für diese Funktionalität in Aktion an.

2. Maven Abhängigkeiten

Der schnellste Weg, um einSpring 5-Projekt einzurichten, besteht darin,Spring Boot zu verwenden, indem Sie diespring-boot-starter-parent-Abhängigkeit zupom.xml: hinzufügen


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

Wir benötigen auch diespring-boot-starter-web undspring-boot-starter-test für unser Beispiel, um einen Webanwendungskontext in einemJUnit-Test zu verwenden:


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


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

Natürlich istSpring Boot nicht erforderlich, um die neue funktionale Methode zum Registrieren einer Bean zu verwenden. Wir könnten auch einfach die Abhängigkeit vonspring-coredirekt hinzufügen:


    org.springframework
    spring-core
    5.0.2.RELEASE

3. Funktionale Bean-Registrierung

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

  • a Supplier argument wird zum Erstellen des Objekts verwendet

  • a BeanDefinitionCustomizer vararg, mit denen ein oder mehrere Lambda-Ausdrücke zum Anpassen vonBeanDefinition bereitgestellt werden können; Diese Schnittstelle verfügt über eine einzelnecustomize()-Methode

Lassen Sie uns zunächst eine sehr einfache Klassendefinition erstellen, mit der wir Beans erstellen:

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

Fügen wir auch eine@SpringBootApplication-Klasse hinzu, mit der wir einenJUnit-Test ausführen können:

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

Als Nächstes können wir unsere Testklasse mithilfe der Annotation@SpringBootTesteinrichten, um eine Instanz vonGenericWebApplicationContextzu erstellen:

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

    //...
}

In unserem Beispiel wird der TypGenericWebApplicationContextverwendet, aber jeder Typ von Anwendungskontext kann auf die gleiche Weise zum Registrieren einer Bean verwendet werden.

Mal sehen, wiewe can register a bean using a lambda expression for creating the instance:

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

Lassen Sie uns überprüfen, ob wir die Bean jetzt abrufen und verwenden können:

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

assertTrue(myService.getRandomNumber() < 10);

In diesem Beispiel sehen wir, dass der Bean-Name, wenn er nicht explizit definiert ist, aus dem Kleinbuchstaben der Klasse ermittelt wird. Die oben beschriebene Methode kann auch mit einem expliziten Bean-Namen verwendet werden:

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

Als nächstes wollen wir sehen, wiewe can register a bean by adding a lambda expression to customize it:

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

Dieses Argument ist ein Rückruf, mit dem wir Bean-Eigenschaften wie das Flag vonautowire-candidateoder das Flag vonprimaryfestlegen können.

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie wir die funktionale Methode zum Registrieren einer Bean verwenden können.

Der Quellcode für das Beispiel lautetover on GitHub.