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.