What does the Spring framework do? Should I use it? Why or why not?
O Spring é um framework que ajuda você a "conectar" diferentes componentes juntos. É mais útil em casos em que você tem muitos componentes e você pode decidir combiná-los de maneiras diferentes, ou facilitar a troca de um componente por outro, dependendo de configurações ou ambientes diferentes.
This is what I've always understood "dependency injection" to be.
Eu sugeriria uma definição diferente:
"Projete seus objetos para que eles dependam de uma força externa para fornecer a eles o que eles precisam, com a expectativa de que essas dependências sejam sempre injetadas antes que alguém as peça para começar a fazer seus trabalhos habituais. "
Compare isso com: "Cada objeto é responsável por sair e encontrar tudo e todos de que precisa ao iniciar".
it looks like it necessitates a whole bunch of XML configuration
Bem, a maior parte do material XML (ou baseado em anotações) está dizendo coisas para o Spring como:
- Quando alguém perguntar por "HammerStore", quero que você crie uma instância de
example.HammerStore
e a retorne. Armazene em cache a instância da próxima vez, pois é necessário apenas uma loja. - Quando alguém pergunta por "SomeHammer", quero que você peça uma "HammerStore" e retorne o resultado do método
makeHammer()
da loja. Não não armazena este resultado em cache. - Quando alguém solicita "SomeWrench", quero que você crie uma instância de
example.WrenchImpl
, use a configuraçãogaugeAmount
e coloque-a na propriedadesetWrenchSize()
da instância. Não armazene em cache o resultado. - Quando alguém pergunta por "LocalPlumber", desejo criar uma instância de
example.PlumberImpl
. Coloque a string "Pedro" em seu métodosetName()
, coloque um "SomeHammer" em seu métodosetHammer()
e coloque um "SomeWrench" em seu métodosetWrench()
. Devolva o resultado e armazene em cache o resultado para mais tarde, pois só precisamos de um canalizador.
Dessa forma, o Spring permite que você conecte seus componentes, identifique-os, controle seus ciclos de vida / armazenamento em cache e altere o comportamento com base na configuração.
To facilitate [testing] I typically make (at least) two versions of a method : one that uses instance variables, and one that only uses variables that are passed in to the method.
Isso soa como muita sobrecarga por não ter muito benefício para mim. Em vez disso, faça com que suas variáveis de instância tenham protected
ou visibilidade do pacote e localize a unidade testes dentro do mesmo pacote com.mycompany.whatever
. Dessa forma, você pode inspecionar e alterar as variáveis de instância sempre que quiser durante o teste.