Inversão de controle e injeção de dependência em Java / Spring

Índice
Esta é a quarta parte de uma série de tutoriais focados na revisão dos tópicos básicos da linguagem Java para preparar o leitor no uso do Spring Framework. A primeira parte desta série de tutoriais pode ser obtida aqui, a segunda parte pode ser obtida aqui e a terceira parte aqui. Neste tutorial veremos 2 conceitos básicos que devemos manipular se quisermos usar o Spring corretamente: Inversão de Controle e Injeção de Dependências.
Em primeiro lugar, quero esclarecer que esses conceitos são muito melhor explicados por Martin Fowler neste artigo e traduzidos para o espanhol nesta página, mas minha intenção é tentar resumir o conceito para torná-lo facilmente compreensível e poupar um pouco da leitura do artigo (embora você esteja cordialmente convidado a lê-lo se tiver mais perguntas).
O termo é relativamente recente, mas é um padrão de programação que remonta aos programas criados usando programação sequencial pura, onde um único programador (ou grupo de programadores) sentou-se para escrever uma série de etapas ou instruções computacionais a serem realizadas na perfeição sequência do início ao fim com a intenção de obter um último resultado.
Nesta época (não pense que foi há muitos anos) as chamadas aos métodos e bibliotecas sempre vinham de uma fonte central que se encarregava de manipular todas as variáveis ​​em um mesmo programa. Posteriormente, foram desenvolvidas interfaces gráficas que se encarregaram de gerenciar as entradas de dados para o programa, enquanto o fluxo principal do programa se encarregou de fornecer tratadores para os eventos que ocorriam na interface gráfica (ativa algo ao clicar, pressionando esta tecla , movendo o mouse, etc.) enquanto a interface está em um loop constante. Desta forma, o controle do programa é revertido, a interface gráfica fica encarregada de notificar o fluxo principal do que fazer e como, sem a necessidade de saber exatamente COMO se faz.
Se você notar, as interfaces em Java podem ajudá-lo a transferir o controle de um aplicativo para agentes externos, mas o conceito é aplicável a encadeamentos daemon que aguardam a ocorrência de um evento para disparar, uma classe que é responsável por instanciar e entregar implementações de outras classes para o programa (padrão de fábrica) e essencialmente qualquer padrão que permita transmitir o controle do programa a algum agente externo.
É um tipo particular de Inversão de Controle em que uma classe A não sabe qual objeto vai usar no momento de ser compilada, mas só conhece as ações que deve realizar com aquele objeto. Vamos supor a seguinte classe (que é baseada nas classes criadas em meu tutorial anterior):
 classe pública Desenhista {praça pública; Cartunista público () {quadrado = novo Quadrado (); } public void MasterDraw () {square.Draw (); }} 

Como você verá, esta classe "Desenhista" depende inteiramente da classe "Quadrado", uma vez que é responsável pelo ciclo de vida do objeto quadrado que será usado posteriormente. Esta forma de criar uma classe "Desenhista" é muito impraticável porque se mais tarde quiséssemos que o Desenhista desenhasse retângulos ou triângulos, teríamos que modificar o código base para isso.
Em vez disso, podemos criar uma classe mais reutilizável se implementarmos a interface "Drawable" que criamos no tutorial anterior:
 public class Draftsman {public Drawable drawing; Desenhista público (Drawable d) {desenho = d; } public void MasterDrawing () {drawing.Drawing (); }} 

Desta forma os objetos da classe "Desenhador" não "controlam" o objeto que devem desenhar, mas apenas sabem que implementa a interface Drawable e, posteriormente, esses objetos "Desenhador" que irei criar em minha aplicação ou que alguém senão vai ser usado em um aplicativo que acessa minha biblioteca de objetos, eles são perfeitamente capazes de receber qualquer objeto que implemente a interface "Drawable".
No exemplo anterior, estamos aplicando o que é conhecido como "Constructor Inyection" já que a dependência é injetada no nível do construtor, mas você também pode injetar a dependência por meio dos "Setters" ou, em outras linguagens de programação, pode injetar os parâmetros ou as interfaces (em Java você não pode modificar os parâmetros ou as interfaces que aceita um método em tempo de execução, mas Python, por exemplo, permite que métodos aceitem parâmetros sem especificar o tipo dos parâmetros.)
 public class Draftsman {public Drawable drawing; public void setDrawing (Drawable d) {drawing = d; } public void MasterDrawing () {drawing.Drawing (); }} 

O Injeção de dependência essencialmente permite uma separação das funcionalidades do seu programa. Essa independência permite que você teste suas classes sem (vale a pena repetir) sua classe ser amarrada a nada. Esta independência é uma das peças-chave para usar Primavera, os componentes dependem da estrutura e não do aplicativo, você pode criar objetos que existem fora de seu aplicativo e usá-los apenas quando precisar deles.
A partir do próximo tutorial começaremos a trabalhar diretamente com o Spring e você verá como todos os conceitos que vimos até agora estão relacionados ao seu funcionamento e permitirão que você adquira o conhecimento necessário em um curto espaço de tempo.
Aguardo seus comentários, Até a próxima vez!Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave