Sites estáticos escalam: Onze vs. Next.js no 11º evento
13 de maio de 2024Adotando uma abordagem ‘máquina primeiro’ para gerenciamento de identidades
13 de maio de 2024Spring é uma estrutura clássica — 50% dos desenvolvedores a usam atualmente e é ótima para criar aplicativos independentes de nível de produção. Com suas novas classes, interfaces e APIs auxiliando no processo de desenvolvimento, os desenvolvedores devem se educar para decidir se desejam usá-las em sua codificação. Isso ocorre porque o uso indevido dos novos recursos do Spring Boot pode levar a bugs, configurações incorretas e problemas de segurança que podem afetar a qualidade do código.
Há três pontos importantes a serem observados ao usar a estrutura Spring.
Operações Transacionais
Todas as operações do banco de dados devem ser confirmadas para estarem disponíveis para outras conexões. Isso significa que para cada operação realizada no banco de dados, o processo envolve a abertura de uma transação, a alteração dos dados e a confirmação da transação ou a reversão da transação se alguma coisa falhar.
Spring pode anotar métodos para criar proxies via @Transactional, gerando código que opera perfeitamente dentro da base de código para gerenciar transações. No entanto, você pode ter cadeias de chamadas de métodos em que uma operação faz diversas alterações no banco de dados e essas alterações precisam ser divididas em vários métodos para maior clareza. É aí que ocorre a propagação transacional.
Normalmente, temos um método de ponto de entrada com a anotação @Transactional que inicia a transação. O restante dos métodos na cadeia de chamadas não especificará a anotação, o que permite que o primeiro método faça todo o commit. Este é o método de propagação padrão necessário. Se não houver nenhuma transação em execução, uma será criada.
Mas a realidade é muitas vezes mais complexa do que imaginamos. Por exemplo, digamos que você tenha métodos que fazem parte de operações diferentes e, às vezes, seu método é a única operação adequada. Nessas cadeias de chamadas, temos que manter a propagação de transações compatível, mas o Spring não considerará as especificações de transação da auto-invocação.
Então o que isso quer dizer? Quando você chama um método de outro na mesma classe, o Spring usará a abordagem “this” para se referir ao método receptor. Spring então gera o código como um proxy para lidar com transações que não podem ser executadas.
Para evitar isso, nos métodos que podem executar outros métodos dentro de transações, devemos especificar a anotação @Transaction.
Entidades Persistentes
Uma das grandes vantagens do Spring é sua facilidade de interação com a camada de persistência. Para usar objetos e propriedades digitados, Java fornece uma anotação @Entity para representar uma tabela relacional, e Spring fornece a anotação @Document para representar documentos MongoDB e ElasticSearch. Nestes casos, o Spring pode utilizar as informações do elemento e fazer uma ponte entre o domínio do objeto e o domínio do banco de dados.
É fundamental entender aqui que esses objetos representam objetos de dados com conversão direta para os elementos armazenados no banco de dados, ou seja, todos os campos carregados por aquele objeto serão salvos no banco de dados. Spring é capaz de compartilhar métodos para gerar serviços REST API que são executados quando o usuário faz uma solicitação HTTP para esse servidor. Esses métodos também permitem o uso de entidades ou documentos como argumentos que o Spring mapeará a partir da carga útil da solicitação.
Para evitar problemas de segurança, como um invasor se passando por usuário, é incentivado o uso de objetos de transferência de dados (DTOs) para traduzir as informações provenientes do usuário na entidade ou documento. Isso considerará apenas as informações necessárias e também higienizará a tradução.
Definições de feijão
O principal poder do Spring é sua injeção de dependência, que permite aos usuários definir beans que serão injetados em outros objetos e sua vida útil. Com esse recurso, as classes só precisam saber quais são suas dependências. Não é necessário entender como e quando eles devem ser instanciados e excluídos.
Spring também possui um mecanismo de descoberta de bean; ele verifica pacotes de código-fonte em busca de definições de bean. O contexto Spring então os instancia de acordo com a configuração. Mas com esse poder vem a responsabilidade. É importante estar ciente de que esse mecanismo de verificação pode afetar o desempenho geral do aplicativo e induzir erros de tempo de execução que são difíceis de detectar durante a codificação. A chave para evitar isso é sempre ter um pacote no aplicativo como ponto de partida da varredura do bean para Spring.
Spring, com sua estrutura de injeção de dependência, oferece um poderoso mecanismo de injeção desses beans no lado do consumidor. Isso torna as instâncias de beans muito fáceis de usar, com escopos de vida específicos, sem a necessidade de se preocupar com quando e onde esses beans foram criados ou excluídos. Para evitar que a injeção de beans seja feita antes do necessário, o que pode prejudicar o desempenho da aplicação, é recomendado não utilizar a anotação @Autowired. Em vez disso, a injeção deve ser solicitada o mais tarde possível quando for necessária pela injeção de parâmetros. Isso dirá ao Spring que o bean precisa ser criado logo antes da criação do bean dependente.
Pensamentos finais
Spring possui alguns recursos fantásticos que auxiliam no processo de desenvolvimento, mas também vem com configurações complexas. É vital compreender as limitações e desvantagens do Spring para obter o máximo valor dele, mas isso pode ser difícil.
Nem sempre está claro onde o código pode potencialmente criar perturbações no desempenho e na estabilidade. É aqui que soluções de análise estática como o Sonar podem ajudar, com regras que cobrem e identificam os principais problemas, fornecendo avisos durante o processo de codificação, bem como realizando monitoramento constante no pipeline de CI/CD. Com as regras certas em vigor para garantir a qualidade, é mais fácil ter certeza de que o código que está sendo escrito resultará em um software que agrega valor real e não se torna um passivo.
A postagem Spring Framework tem três armadilhas principais – aqui está o que fazer apareceu pela primeira vez em The New Stack.