Anotações do Spring Bean
1. Visão geral
Neste artigo, discutiremos a maioria doscommon Spring bean annotations usados para definir diferentes tipos de feijão.
Existem várias maneiras de configurar beans em um contêiner Spring. Podemos declará-los usando a configuração XML. Podemos declarar beans usando a anotação@Bean em uma classe de configuração.
Ou podemos marcar a classe com uma das anotações do pacoteorg.springframework.stereotype e deixar o resto para a varredura de componentes.
2. Digitalização de componentes
O Spring pode verificar automaticamente um pacote em busca de beans se a verificação de componentes estiver ativada.
@ComponentScan configura qualpackages to scan for classes with annotation configuration. Podemos especificar os nomes dos pacotes básicos diretamente com um dos argumentosbasePackages ouvalue (value é um alias parabasePackages):
@Configuration
@ComponentScan(basePackages = "com.example.annotations")
class VehicleFactoryConfig {}
Além disso, podemos apontar para classes nos pacotes básicos com o argumentobasePackageClasses:
@Configuration
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}
Ambos os argumentos são matrizes para que possamos fornecer vários pacotes para cada um.
Se nenhum argumento for especificado, a varredura ocorre a partir do mesmo pacote onde a classe anotada@ComponentScan está presente.
@ComponentScan aproveita o recurso de anotações repetidas do Java 8, o que significa que podemos marcar uma classe com ele várias vezes:
@Configuration
@ComponentScan(basePackages = "com.example.annotations")
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}
Como alternativa, podemos usar@ComponentScans para especificar várias configurações@ComponentScan:
@Configuration
@ComponentScans({
@ComponentScan(basePackages = "com.example.annotations"),
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
})
class VehicleFactoryConfig {}
Quandousing XML configuration, a configuração da verificação de componente é tão fácil:
3. @Component
@Component é uma anotação de nível de classe. Durante a varredura do componente,Spring Framework automatically detects classes annotated with @Component.
Por exemplo:
@Component
class CarUtility {
// ...
}
Por padrão, as instâncias de bean desta classe têm o mesmo nome que o nome da classe com uma inicial em minúscula. Além disso, podemos especificar um nome diferente usando o argumento opcionalvalue desta anotação.
Como@Repository,@Service,@Configuration e@Controller são todas metanotações de@Component, eles compartilham o mesmo comportamento de nomenclatura de bean. Além disso, o Spring os coleta automaticamente durante o processo de digitalização de componentes.
4. @Repository
As classes DAO ou Repositório geralmente representam a camada de acesso ao banco de dados em um aplicativo e devem ser anotadas com@Repository:
@Repository
class VehicleRepository {
// ...
}
Uma vantagem de usar essa anotação é queit has automatic persistence exception translation enabled. Ao usar uma estrutura de persistência como o Hibernate, as exceções nativas lançadas nas classes anotadas com@Repository serão automaticamente traduzidas em subclasses deDataAccessExeption do Spring.
To enable exception translation, precisamos declarar nosso próprio beanPersistenceExceptionTranslationPostProcessor:
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Observe que, na maioria dos casos, o Spring executa a etapa acima automaticamente.
Ou, via configuração XML:
5. @Service
Obusiness logic de um aplicativo geralmente reside dentro da camada de serviço - então, usaremos a anotação@Service para indicar que uma classe pertence a essa camada:
@Service
public class VehicleService {
// ...
}
6. @Controller
@Controller é uma anotação de nível de classe que informa ao Spring Framework que esta classe serve comocontroller in Spring MVC:
@Controller
public class VehicleController {
// ...
}
7. @Configuration
Configuration classes podemcontain bean definition methods anotadas com@Bean:
@Configuration
class VehicleFactoryConfig {
@Bean
Engine engine() {
return new Engine();
}
}
8. Anotações de estereótipo e AOP
Quando usamos anotações de estereótipo Spring, é fácil criar um pointcut que visa todas as classes que têm um estereótipo particular.
Por exemplo, suponha que desejamos medir o tempo de execução dos métodos da camada DAO. Criaremos o seguinte aspecto (usando anotações AspectJ) aproveitando o estereótipo@Repository:
@Aspect
@Component
public class PerformanceAspect {
@Pointcut("within(@org.springframework.stereotype.Repository *)")
public void repositoryClassMethods() {};
@Around("repositoryClassMethods()")
public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint)
throws Throwable {
long start = System.nanoTime();
Object returnValue = joinPoint.proceed();
long end = System.nanoTime();
String methodName = joinPoint.getSignature().getName();
System.out.println(
"Execution of " + methodName + " took " +
TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
return returnValue;
}
}
Neste exemplo, criamos um pointcut que corresponde a todos os métodos em classes anotadas com@Repository. Usamos o conselho@Around para, em seguida, direcionar esse pointcut e determinar o tempo de execução das chamadas de métodos interceptados.
Usando essa abordagem, podemos adicionar log, gerenciamento de desempenho, auditoria ou outros comportamentos a cada camada de aplicativo.
9. Conclusão
Neste artigo, examinamos as anotações do estereótipo Spring e aprendemos que tipo de semântica elas representam.
Também aprendemos como usar a varredura de componentes para informar ao contêiner onde encontrar classes anotadas.
Por fim - vimos como essas anotaçõeslead to a clean, layered designe separam as preocupações de um aplicativo. Eles também tornam a configuração menor, pois não precisamos mais definir explicitamente os beans manualmente.
Como de costume, os exemplos estão disponíveisover on GitHub.