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]にあります。