Spring 5の機能Bean登録

1概要

Spring 5はアプリケーションのコンテキストで機能的なBean登録をサポートしています。

簡単に言えば、これは、 GenericApplicationContext クラスで定義された新しい registerBean() メソッドのオーバーロードされたバージョンを通して行うことができます。

この機能の実際の例をいくつか見てみましょう。

2 天国 依存関係

Spring 5 プロジェクトを設定する最も簡単な方法は、 spring-boot-starter-parent 依存関係を pom.xmlに追加して Spring Boot__を使用することです。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-web%22%20AND%20g%3A%22org.springframework.boot%22も必要です。 JUnit テストでWebアプリケーションコンテキストを使用するには、この例では[ spring-boot-starter-web ]と spring-boot-starter-test を使用します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

もちろん、 Spring Boot は、Beanを登録するための新しい機能的な方法を使用するためには必要ありません。直接 spring-core 依存関係を直接追加することもできます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

3機能性ビーン登録

  • registerBean() APIは、パラメータとして2種類の機能インタフェースを受け取ることができます。

  • オブジェクトの作成に使用された Supplier 引数

  • BeanDefinitionCustomizer vararg

BeanDefinition をカスタマイズするための1つ以上のラムダ式。このインタフェースは単一の customize() メソッドを持ちます。

まず、Beanの作成に使用する非常に単純なクラス定義を作成しましょう。

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

JUnit テストを実行するために使用できる @ SpringBootApplication クラスも追加しましょう。

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

次に、 @ SpringBootTest アノテーションを使用して GenericWebApplicationContext インスタンスを作成して、テストクラスを設定できます。

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

   //...
}

この例では GenericWebApplicationContext タイプを使用していますが、Beanを登録するためにあらゆるタイプのアプリケーションコンテキストを使用できます。

インスタンスを作成するためにラムダ式を使用してBeanを登録する方法を見てみましょう。

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

Beanを取得して使用できることを確認しましょう。

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

assertTrue(myService.getRandomNumber() < 10);

この例では、Bean名が明示的に定義されていない場合は、クラスの小文字の名前から決定されることがわかります。

上記と同じ方法を明示的なBean名で使用することもできます。

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

次に、ラムダ式を追加してBeanを登録する方法を説明します。

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

この引数は、 autowire-recipient flagや primary flagなどのBeanプロパティを設定するために使用できるコールバックです。

4結論

このクイックチュートリアルでは、Beanを登録するための機能的な方法をどのように使用できるかを見てきました。

例のソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-5[over on GitHub]にあります。