Diferença entre @Controller e @Component no Spring Framework

  1. Em geral, ambas as anotações fazem com que a classe seja gerenciada pelo contêiner Spring IOC
  2. @Controller herda de @Component e oferece funcionalidade adicional:
    • @Controller é usado principalmente em classes controladoras do Spring MVC para tratar requisições web
    • @Component é uma anotação genérica para qualquer classe gerenciada pelo contêiner Spring
  3. @Controller usa anotações como @RequestMapping para definir mapeamentos de endpoints
  4. O Spring MVC escaneia automaticamente classes com @Controller, enquanto @Component tem escopo mais amplo

Solução de problemas de rota

  1. Verificar erros nos caminhos e parâmetros
  2. Confirmar existência das anotações necessárias e escopo de varredura de pacotes
  3. Validar configurações de interceptadores

Uso de @RestController

  1. @RestController é uma anotação especial para serviços RESTful
  2. Combina @Controller e @ResponseBody, retornando dados diretamente no corpo da resposta HTTP
  3. Evita o uso de resolvedores de visão para retornos em formato JSON ou XML
  4. Endpoints RESTful usam @GetMapping, @PostMapping, etc.

@RequestBody

  1. Vincula o corpo da requisição HTTP a parâmetros de método
  2. Utilizado principalmente com POST e PUT para processar dados em JSON/XML
  3. @RequestParam é usado para parâmetros de consulta em requisições GET

Injeção de dependência com @Autowired vs @Resource

  1. @Autowired busca por tipo, usando @Qualifier para resolver ambiguidades
  2. @Resource buscá por nome
  3. Injeção via construtor é recomendada como prática mais segura

Exemplos de injeção


// Via constructor
private AutorizadorLogin autorizador;

@Autowired
public ConfiguradorWeb(AutorizadorLogin autorizador) {
    this.autorizador = autorizador;
}

Escopo de variáveis com var e let

  1. var tem escopo de função com hoisting
  2. let tem escopo de bloco e não permite redeclaração

Implementação de interceptador

  1. Configurar padrões de interceptação e isenções
  2. Implementar lógica no método preHandle
  3. Recuperar dados de sessão para verificação de estado

Classe de interceptador


@Component
public class AutorizadorLogin implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
        Usuario usuario = (Usuario) req.getSession().getAttribute("usuario");
        if (usuario == null) {
            res.sendRedirect(req.getContextPath() + "/perfil/solicitarLogin");
            return false;
        }
        return true;
    }
}

Classe de configuração


@Configuration
public class ConfiguradorWeb implements WebMvcConfigurer {
    
    @Autowired
    private AutorizadorLogin autorizador;
    
    @Override
    public void addInterceptors(InterceptorRegistry registro) {
        registro.addInterceptor(autorizador)
            .addPathPatterns("/**")
            .excludePathPatterns("/perfil/login", "/perfil/solicitarLogin");
    }
}

Tags: SpringFramework SpringMVC JavaEE DependencyInjection javascript

Publicado em 10-6 06:32