Contexto

Um sistema simples para cálculo do valor total de um pedido, considerando desconto e frete, onde cada responsabilidade é isolada em um componente.

A ideia central é aplicar conceitos de injeção de dependência e inversão de controle de forma prática através do Spring Boot, buscando entender a proposta do framework para aplicar estes conceitos, assim como comparar com implementações mais básicas dos conceitos (indiretamente através do repositório de práticas citado mais à frente).

Ao utilizar o framework, observei que esses conceitos são tratados como pilares do seu funcionamento. A partir do uso de annotations e como núcleo do framework, grande parte do “wiring” entre componentes é abstraída do desenvolvedor, reduzindo código explícito e favorecendo organização, segurança estrutural e produtividade.

diagrama

O que explorei

Aplicações escaláveis e manuteníveis de longo prazo precisam de uma boa organização quanto à criação e consumo de componentes, regras e recursos, e nisso pode-se aplicar a injeção de dependências e inversão de controle.

Durante práticas de como resolver problemas e aplicar conceitos como este sobre: Injeção de Dependência(com Java Puro), geralmente coloco neste repositório de prática AQUI, onde realizo o processo do modo mais simples e “roots” até alcançar a implementação com Frameworks que abstraem implementações e resolvem problemas visando produtividade.

Foi aplicado neste projeto a criação de componente Spring e observando como a aplicação os consome.

Foi possível ainda aplicar a separação explícita de responsabilidades entre cálculos (pedido e frete). Para explorar esses temas, foquei na estrutura da aplicação com Spring com interface de uso via linha de comando.

Problema / motivação

Sistemas simples já possuem mais de uma responsabilidade, mesmo antes de envolver banco de dados, APIs, etc., e a partir disso:

  • Explorar como o Spring resolve dependência entre componentes;
  • Entender como aplicar os conceitos programando-os utilizando o Spring Boot;
  • Visualizar por meio de um caso pequeno como a separação de serviços aumenta a clareza e organização;
  • Visualizar de maneira simples temas como Injeção de Dependência e Inversão de Controle, que são pilares fundamentais e que juntos formam a base de como o framework funciona;

Recursos utilizados

  • Java 17
  • Spring Boot
  • Annotations do Framework como:
    • @Service ou @Component
    • @Autowired
  • Injeção de dependência por construtor (ver link mencionado anteriormente)
  • Uso e log de retorno da aplicação através do terminal utilizando a interface CommandLineRunner

Continuidade

Entre o repositório de prática base mencionado anteriormente e este microprojeto, foi possível visualizar e comparar injeção de dependência via construtor, por campo e annotation, o que permite ter como próximos passos do tema:

  • A exploração sobre o uso de @Primary e @Qualifier para resolução de dependências;
  • Adição de testes para observar o impacto da injeção de dependências na testabilidade;
  • Análise com container e ApplicationContext com maior profundidade, analisando bootstrap do Spring Boot e Auto-configuration.

Impressões e aprendizados

Observei que, de fato, a injeção de dependência força clareza de responsabilidade desde o início e o framework simplifica sua prática através de suas annotations, minimizando código boilerplate.

Percebi que há a necessidade de práticas como esta, que gerou este microprojeto, que podem ser necessárias para quem está iniciando no uso do framework, para haver entendimento conceitual e não parecer que o framework está fazendo mágica ou ter dificuldades futuras em diagnóstico e resolução de bugs em uma aplicação.

Observei também que injeção de dependência por construtor é visível e mais fácil de raciocinar.

Este microprojeto mostra ainda que arquitetura aparece antes de web, banco, persistência ou projetos grandes e que mesmo em projetos pequenos não há justificativa para evitar a separação de dependências ou aproveitar o ganho de produtividade que o framework pode oferecer mesmo para projetos menores.

Observação final

Este microprojeto não foi criado para ensinar Spring Boot, ensinar cálculos de negócio, ele visa trazer clareza e demonstrar estrutura e composição, estabelecendo ainda uma base mental para o entendimento, criação e uso de controllers, services, repositories, testes e arquitetura futura.

O experimento visa tornar fundamentos sólidos e claros para evitar mal uso do framework.

📂 Repositório do Projeto

A implementação do microprojeto está disponível no repositório:

🔗 https://github.com/rafael-o-cunha/microprojeto_01_java_e_spring_boot


#written_by_human