Anotações do Spring Boot mais Comuns – Tutorial Passo a Passo

O Spring Boot é conhecido por simplificar o desenvolvimento de aplicativos Java, hoje vamos criar vários exemplos sobre as principais Anotações do Spring Boot, oferecendo uma variedade de recursos que agilizam a configuração e o desenvolvimento.

As anotações são indispensáveis nesse ecossistema, fornecendo maneiras simples e eficazes de configurar e controlar o comportamento dos componentes.

Assim como as anotações do Java, este framework também tem as suas de formas isoladas e que cada uma delas tem uma função especifica no projeto.

O Papel das Anotações no Spring Boot

As anotações no Spring Boot são marcadores especiais que podem ser aplicados a classes, métodos ou campos para fornecer informações e instruções adicionais ao framework durante a execução.

Elas são essenciais para definir a configuração, o comportamento dos componentes e a integração com outros módulos.

Vamos começar um tutorial passo a passo com 9 das anotações mais comuns do Spring Boot.

anotações do spring boot

1º Anotação @SpringBootApplication

Essa anotação é frequentemente encontrada na classe principal de um aplicativo Spring Boot. Ela combina três outras anotações: @Configuration, @EnableAutoConfiguration e @ComponentScan.

Isso permite que o Spring Boot realize a configuração automática com base nas dependências presentes no classpath, além de identificar e registrar beans e componentes no contexto da aplicação.

Exemplo simples:

package br.com.virandoprogramador.anotacoes

@SpringBootApplication
public class MinhaAplicacaoSpringBootApplication {

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

Neste exemplo, a classe MinhaAplicacaoSpringBootApplication é a classe principal do aplicativo. A anotação @SpringBootApplication é usada para configurar automaticamente o aplicativo Spring Boot. O método main inicia a aplicação, usando SpringApplication.run().

A anotação @SpringBootApplication também permite a personalização de diferentes aspectos do aplicativo, por meio de atributos:

  • exclude: Permite a exclusão de classes de autoconfiguração específicas.
  • scanBasePackages: Define pacotes adicionais a serem escaneados para componentes.
  • scanBasePackageClasses: Define classes adicionais a serem escaneadas para componentes.

2º Anotação @RestController

A anotação @RestController é uma extensão da anotação @Controller, sendo específica para aplicativos que implementam RESTful APIs.

Ela combina a funcionalidade das anotações @Controller e @ResponseBody, permitindo que cada método dessa classe retorne diretamente dados serializados em um formato aceitável, como JSON ou XML, sem a necessidade de usar explicitamente a anotação @ResponseBody.

Criando Endpoints RESTful

No contexto do Spring Boot, os controladores anotados com @RestController são responsáveis por definir os pontos de extremidade (endpoints) para lidar com as requisições HTTP.

Exemplo:

package br.com.virandoprogramador.controller; 

import br.com.virandoprogramador.models.User;
import br.com.virandoprogramador.services.UserService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        List<User> users = userService.getAllUsers();
        return new ResponseEntity<>(users, HttpStatus.OK);
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        if (user != null) {
            return new ResponseEntity<>(user, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User createdUser = userService.createUser(user);
        return new ResponseEntity<>(createdUser, HttpStatus.CREATED);
    }

    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable("id") Long id, @RequestBody User user) {
        User updatedUser = userService.updateUser(id, user);
        if (updatedUser != null) {
            return new ResponseEntity<>(updatedUser, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable("id") Long id) {
        userService.deleteUser(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
}

Neste exemplo, a classe UserController é anotada com @RestController e define endpoints RESTful para lidar com operações CRUD (Create, Read, Update, Delete) em recursos de usuários /api/users.

  • @GetMapping: Mapeia requisições HTTP GET para recuperar todos os usuários ou um usuário por ID.
  • @PostMapping: Mapeia requisições HTTP POST para criar um novo usuário.
  • @PutMapping: Mapeia requisições HTTP PUT para atualizar um usuário existente.
  • @DeleteMapping: Mapeia requisições HTTP DELETE para excluir um usuário por ID.

Utilizando ResponseEntity

O uso de ResponseEntity permite um controle preciso das respostas HTTP retornadas pelos endpoints. Ele permite definir o corpo da resposta, status HTTP e cabeçalhos de maneira flexível.

3º Anotação @RequestMapping

No desenvolvimento de aplicativos web usando o Spring Boot, a anotação @RequestMapping é usada para mapear solicitações HTTP para métodos específicos em controladores, permitindo que os desenvolvedores criem APIs RESTful ou endpoints web de maneira flexível e personalizada.

O Que é @RequestMapping?

A anotação @RequestMapping é uma anotação versátil que mapeia solicitações HTTP para métodos específicos dentro de um controlador.

Ela pode ser aplicada a nível de classe ou de método, permitindo a definição de mapeamentos de URL para diferentes métodos de manipulação de solicitações HTTP, como GET, POST, PUT, DELETE, entre outros.

package br.com.virandoprogramador.controller; 

@RestController
@RequestMapping("/api")
public class VirandoProgramadorController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

Neste exemplo, a classe VirandoProgramadorController é anotada com @RestController e @RequestMapping(“/api”), indicando que todos os endpoints dentro desta classe serão mapeados com o prefixo /api. O método hello() é mapeado para a URL relativa /hello. Assim, quando uma solicitação GET é feita para /api/hello, o método hello() é invocado e retorna a mensagem “Hello, World!”.

4º Anotação @Component

A anotação @Component desempenha um papel importante no contexto do Spring, sendo a base para outras anotações especializadas que ajudam na definição e gerenciamento de componentes.

O Que é @Component?

A anotação é uma das mais simples e genéricas no Spring Boot. Ela é usada para identificar uma classe como um componente gerenciado pelo Spring, permitindo que o framework a reconheça automaticamente e a registre no contexto da aplicação como um bean.

Utilizando Componentes Gerenciados

Os componentes gerenciados pelo Spring podem ser injetados em outras classes usando as anotações @Autowired ou através da injeção de dependências em construtores, métodos setters ou diretamente em campos.

@Component
public class MinhaClasseComponente {
}

@Service
public class MeuServico {

    private final MinhaClasseComponente minhaComponente;

    @Autowired
    public MeuServico(MinhaClasseComponente minhaComponente) {
        this.minhaComponente = minhaComponente;
    }
}

Neste exemplo, a classe MeuServico é uma classe de serviço que injeta MinhaClasseComponente usando a anotação @Autowired no construtor. Isso permite o uso direto do componente dentro do serviço.

5º Anotação @Service

A anotação @Service é uma das anotações especializadas do Spring Framework. Ela é usada para marcar classes que representam a camada de serviço em uma aplicação Spring.

Essa camada contém a lógica de negócios, implementando regras e processos específicos do domínio da aplicação.

Exemplo de uma classe Service:

package br.com.virandoprogramador.service; 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User salvar(User user) {
        return userRepository.save(user);
    }

    public User buscarPorId(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public User atualizar(Long id, User userDetails) {
        User user = userRepository.findById(id).orElse(null);
        if (user != null) {
            user.setNome(userDetails.getNome());
            user.setEmail(userDetails.getEmail());
            return userRepository.save(user);
        }
        return null;
    }

    public void deletar(Long id) {
        userRepository.deleteById(id);
    }
}

Neste exemplo, temos uma classe UserService anotada com @Service que gerencia operações relacionadas aos usuários (User). A classe UserService é injetada com um UserRepository via construtor para acessar e manipular os dados no banco de dados.

  • salvar: Método para salvar um novo usuário no banco de dados.
  • buscarPorId: Método para buscar um usuário pelo ID no banco de dados.
  • atualizar: Método para atualizar um usuário existente no banco de dados com base no ID fornecido.
  • deletar: Método para deletar um usuário do banco de dados com base no ID fornecido.

6º Anotação @Repository

Ela é usada para marcar classes que atuam como componentes responsáveis pelo acesso a dados, oferecendo uma abstração de camada de persistência para o framework Spring.

O Que é @Repository?

A anotação @Repository é uma anotação especializada do Spring Framework usada para indicar que uma classe serve como um repositório, encapsulando o acesso a dados ou a uma fonte de dados específica.

É comumente usada em conjunto com classes que acessam o banco de dados, realizam operações de leitura e escrita, e lidam com operações CRUD como(Create, Read, Update, Delete).

Exemplo de uma classe Repository:

package br.com.virandoprogramador.repository; 

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);

    List<User> findByNomeIgnoreCaseContaining(String nome);

    List<User> findByAtivoTrue();
}
  • findByEmail: Método que busca um usuário pelo email.
  • findByNomeIgnoreCaseContaining: Método que busca usuários por parte do nome, ignorando maiúsculas e minúsculas.
  • findByAtivoTrue: Método que busca todos os usuários ativos.

Esses métodos são gerados automaticamente pelo Spring Data JPA, sem a necessidade de implementação manual.

Eles utilizam a convenção de nomenclatura do Spring Data, onde o método é analisado e a consulta SQL correspondente é gerada automaticamente.

Além dos métodos padrão oferecidos pelo JpaRepository, você pode adicionar métodos personalizados à interface do repositório, seguindo a convenção de nomenclatura do Spring Data.

7º Anotação @Value

A anotação @Value é uma anotação do Spring Framework que permite injetar valores de propriedades em campos de classe, construtores ou métodos.

Ela é usada para buscar valores de propriedades a partir de arquivos de configuração, como application.properties ou application.yml, configurados diretamente em componentes gerenciados pelo Spring.

Veja um exemplo simples desta anotação:

app:
  minhaPropriedade: Valor da minha propriedade
  outraPropriedade: Valor de outra propriedade
  propriedadePadrao: Valor Padrão

Primeiro precisamos adicionar os valores em nosso arquivo application.yml e em seguida utilizar em uma classe Java:

package br.com.virandoprogramador.component; 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MeuComponente {

    @Value("${app.minhaPropriedade}")
    private String minhaPropriedade;

    @Value("${app.outraPropriedade}")
    private String outraPropriedade;

    @Value("${app.propriedadeInexistente:Valor Padrão Personalizado}")
    private String propriedadeInexistente;

    public String getMinhaPropriedade() {
        return minhaPropriedade;
    }

    public String getOutraPropriedade() {
        return outraPropriedade;
    }

    public String getPropriedadeInexistente() {
        return propriedadeInexistente;
    }
}

Neste exemplo, a classe MeuComponente possui três campos (minhaPropriedade, outraPropriedade e propriedadeInexistente) anotados com @Value. Eles estão mapeados para as propriedades correspondentes no arquivo application.yml.

Se a propriedade não for encontrada no arquivo de configuração YAML, o valor padrão especificado após os dois-pontos será usado (como no caso da propriedade propriedadeInexistente).

Esse é um exemplo básico de como a anotação @Value pode ser usada em conjunto com um arquivo de configuração YAML no Spring Boot para injetar valores de propriedades em componentes gerenciados pelo Spring.

8º Anotação @Autowired

A anotação @Autowired é uma anotação do Spring Framework utilizada para realizar a injeção de dependências automaticamente em classes gerenciadas pelo Spring.

Ela permite que o Spring identifique as dependências necessárias para uma classe e as forneça automaticamente, reduzindo a necessidade de criar instâncias manualmente ou usar o padrão Singleton.

Exemplo simples:

@Component
public class MeuComponente {

    private OutroComponente outroComponente;

    @Autowired
    public MeuComponente(OutroComponente outroComponente) {
        this.outroComponente = outroComponente;
    }
}

Neste exemplo, a classe MeuComponente possui um campo outroComponente anotado com @Autowired no construtor. Quando o Spring inicializa MeuComponente, ele automaticamente fornece uma instância de OutroComponente por meio da injeção de dependências.

Injeção de Dependências em Campos, Métodos e Construtores

A anotação @Autowired pode ser aplicada em diferentes lugares:

  • Construtores: É uma prática recomendada usar o construtor para injeção de dependências, facilitando a criação de testes unitários e evitando estados inconsistentes.
  • Métodos Setters: É possível usar métodos setters anotados com @Autowired para realizar a injeção de dependências, mas essa prática não é tão comum quanto o uso de construtores.
  • Campos: É possível usar a anotação @Autowired diretamente em campos, mas essa prática não é recomendada, pois viola boas práticas de encapsulamento e dificulta a realização de testes unitários.

9º Anotação @Configuration

A anotação @Configuration é uma anotação do Spring usada para marcar classes de configuração. Essas classes geralmente contêm métodos anotados com @Bean, que definem e configuram beans específicos dentro do contexto da aplicação.

Exemplo:

@Configuration
public class AppConfig {

    @Bean
    public MeuBean meuBean() {
        return new MeuBean();
    }

    @Bean
    public OutroBean outroBean() {
        return new OutroBean();
    }
}

A classe AppConfig é anotada com @Configuration. Ela define dois métodos, meuBean() e outroBean(), anotados com @Bean, que são responsáveis por instanciar e configurar os beans dentro do contexto da aplicação.

Métodos @Bean

Os métodos anotados com @Bean dentro de uma classe @Configuration são usados para definir beans gerenciados pelo Spring. Esses métodos retornam instâncias dos objetos que serão gerenciados e injetados pelo contêiner do Spring.

Importando Configurações

A anotação @Configuration também permite importar outras classes de configuração usando a anotação @Import, veja um exemplo:

@Configuration
@Import(OutraConfiguracao.class)
public class AppConfig {
}

Dessa forma, é possível compor diferentes classes de configuração em uma aplicação Spring, dividindo a configuração em módulos ou separando por funcionalidades específicas.

Usando com @ComponentScan

A anotação @Configuration é frequentemente usada em conjunto com @ComponentScan. Ela escaneia pacotes em busca de componentes, enquanto as classes anotadas com @Configuration fornecem configurações.

Conclusão sobre as Anotações do Spring Boot

As anotações como @Autowired, @Component, @Service, @Repository promovem a inversão de controle e a injeção de dependências, reduzindo a necessidade de gerenciamento manual.

A anotação @Configuration permite a criação de classes para configurar e personalizar o comportamento da aplicação, aumentando a flexibilidade e a modularidade do código.

A legibilidade do código é aprimorada com o uso de anotações, tornando mais fácil entender a função e o comportamento de diferentes componentes da aplicação. Contudo, a separação de responsabilidades é facilitada, ajudando na organização e na manutenção do código-fonte.

5/5 - (1 vote)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *