Registro do Bean Funcional da Primavera 5

Registro do Bean Funcional da Primavera 5

1. Visão geral

O Spring 5 vem com suporte para registro de bean funcional no contexto do aplicativo.

Simplificando,this can be done through overloaded versions of a new registerBean() method definido na classeGenericApplicationContext.

Vejamos alguns exemplos dessa funcionalidade em ação.

2. Maven Dependências

A maneira mais rápida de configurar um projetoSpring 5 é usarSpring Boot adicionando a dependênciaspring-boot-starter-parent aopom.xml:


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

Também precisamos despring-boot-starter-webespring-boot-starter-test para nosso exemplo, para usar um contexto de aplicativo da web em um testeJUnit:


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


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

Obviamente,Spring Boot não é necessário para usar a nova forma funcional de registrar um bean. Também poderíamos simplesmente adicionar a dependênciaspring-core diretamente:


    org.springframework
    spring-core
    5.0.2.RELEASE

3. Registro Funcional de Feijão

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

  • a Supplier argument usado para criar o objeto

  • a BeanDefinitionCustomizer vararg que pode ser usado para fornecer uma ou mais expressões lambda para personalizar oBeanDefinition; esta interface tem um único métodocustomize()

Primeiro, vamos criar uma definição de classe muito simples que usaremos para criar beans:

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

Vamos também adicionar uma classe@SpringBootApplication que podemos usar para executar um testeJUnit:

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

Em seguida, podemos configurar nossa classe de teste usando a anotação@SpringBootTest para criar uma instânciaGenericWebApplicationContext:

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

    //...
}

Estamos usando o tipoGenericWebApplicationContext em nosso exemplo, mas qualquer tipo de contexto de aplicativo pode ser usado da mesma maneira para registrar um bean.

Vamos ver comowe can register a bean using a lambda expression for creating the instance:

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

Vamos verificar se agora podemos recuperar o bean e usá-lo:

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

assertTrue(myService.getRandomNumber() < 10);

Podemos ver neste exemplo que se o nome do bean não for definido explicitamente, ele será determinado a partir do nome em minúsculas da classe. O mesmo método acima também pode ser usado com um nome explícito de bean:

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

A seguir, vamos ver comowe can register a bean by adding a lambda expression to customize it:

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

Este argumento é um retorno de chamada que podemos usar para definir as propriedades do bean, como sinalizadorautowire-candidate ou sinalizadorprimary.

4. Conclusão

Neste tutorial rápido, vimos como podemos usar a forma funcional de registrar um bean.

O código-fonte do exemplo pode ser encontradoover on GitHub.