Qualquer pessoa que tenha aprendido a estrutura da primavera deve ter ouvido falar dos dois conceitos da primavera: COI (inversão de controle) e DI (injeção de dependência). Para aqueles que são novos na primavera, eles sempre sentem que os conceitos de COI e DI são vagos e difíceis de entender. Hoje, vou compartilhar com você alguns dos especialistas técnicos on -line do COI da estrutura da primavera e falar sobre minha compreensão do COI da primavera.
O que é COI
O IOC-InversionOfcontrol, ou seja, "Control Inversão", não é uma tecnologia, mas uma ideia de design. No desenvolvimento de Java, o COI significa fornecer aos objetos que você projetou para serem controlados por contêineres, em vez de controlá -los tradicionalmente diretamente dentro de seus objetos.
O COI, que é o núcleo da primavera, percorre o tempo todo. Para a estrutura da primavera, a primavera é responsável por controlar o ciclo de vida de um objeto e a relação entre objetos. O que isto significa? Para dar um exemplo simples, como encontramos uma namorada? Uma situação comum é que vamos a todos os lugares para ver onde temos mulheres bonitas e bonitas e, em seguida, perguntamos sobre seus interesses, números de QQ, números de telefone, números de IP, números de QI ..., encontre maneiras de conhecê-los, dar a eles o que eles gostam e depois hehe ... esse processo é complexo e profundo, e devemos projetar e enfrentar cada ligação a nós mesmos. O mesmo vale para o desenvolvimento tradicional do programa. Em um objeto, se você deseja usar outro objeto, deve obtê -lo (novo sozinho ou consultar um da JNDI). Após o uso, o objeto deve ser destruído (como conexão, etc.), e o objeto sempre será combinado com outras interfaces ou classes.
Como entender o IOC? A chave para entender o COI é esclarecer "quem controla quem, o que controla, por que é uma reversão (deve haver uma positiva) e que aspectos da reversão estão lá", vamos analisar em profundidade:
● Quem controla quem e o quê: design de programação tradicional de javase, criamos objetos diretamente através do novo dentro do objeto, e o programa cria ativamente objetos dependentes; Embora o COI tenha um contêiner especial para criar esses objetos, ou seja, o contêiner do COI controla a criação de objetos; Quem controla quem? Obviamente, o contêiner do COI controla o objeto; O que controlar? Ou seja, controla principalmente a aquisição de recursos externos (não apenas objetos, incluindo arquivos etc.).
● Por que é inversão? Que aspectos são inversão: há uma rotação positiva. As aplicações tradicionais são controladas ativamente por nós mesmos no objeto para obter diretamente o objeto dependente, ou seja, a rotação positiva; enquanto a inversão é o contêiner para ajudar a criar e injetar objetos dependentes; Por que é inversão? Como o contêiner nos ajuda a encontrar e injetar objetos dependentes, o objeto aceita apenas objetos dependentes passivamente, por isso é uma inversão; Quais aspectos são inversões? A aquisição do objeto dependente é revertida.
Vamos usar a legenda para ilustrar que a programação tradicional é mostrada na Figura 1-1, que cria ativamente objetos relacionados e os combina:
Figura 1-1 Diagrama esquemático da aplicação tradicional
Quando eu tenho contêineres do IOC/DI, esses objetos não são mais criados ativamente na classe do cliente, como mostrado na Figura 1-2:
Figura 1-2 Diagrama esquemático da estrutura do programa após o contêiner do IOC/DI
1.1.2 O que o IOC pode fazer
O COI não é uma tecnologia, é apenas um pensamento, uma regra importante de programação orientada a objetos, que pode nos guiar como projetar programas vagamente acoplados e melhores. As aplicações tradicionais são todas criadas ativamente por nós dentro da classe, o que leva a alto acoplamento entre classes e difícil de testar; Com o contêiner do COI, o controle da criação e a localização de objetos dependentes é entregue ao contêiner e o contêiner injeta os objetos combinados; portanto, o objeto é vagamente acoplado, o que também é conveniente para testes, facilita a reutilização funcional e, mais importante, torna toda a arquitetura do programa muito flexível.
De fato, a maior mudança trazida pelo COI para a programação não é do código, mas da perspectiva ideológica e da mudança de "transposição de escravos mestres". O aplicativo era originalmente o chefe e ele tomou a iniciativa de obter quaisquer recursos. No entanto, no IOC/DI DIA, o aplicativo se tornou passivo e ele estava esperando passivamente o contêiner do COI criar e injetar os recursos necessários.
O COI reflete bem uma das regras do design orientado a objetos - a regra de Hollywood: "Não nos procure, procuraremos você"; Ou seja, o contêiner do COI ajuda o objeto a encontrar o objeto dependente correspondente e a injetar, em vez de o objeto procurá -lo ativamente.
1.1.3 COI e DI
DI-dependência injeção, ou seja, "injeção de dependência": as dependências entre os componentes são determinadas pelo contêiner durante o tempo de execução. Figurativamente, o contêiner injeta dinamicamente uma certa dependência no componente. O objetivo da injeção de dependência não é trazer mais funções para o sistema de software, mas aumentar a frequência da reutilização do componente e criar uma plataforma flexível e escalável para o sistema. Através do mecanismo de injeção de dependência, precisamos especificar apenas os recursos exigidos pelo destino, sem nenhum código para concluir nossa própria lógica de negócios por meio de uma configuração simples, sem se preocupar com a origem dos recursos específicos e que os implementam.
Um dos pontos -chave do COI é fornecer dinamicamente um objeto com outros objetos de que precisa durante a operação do sistema. Isso é conseguido através de DI (injeção de dependência). Por exemplo, o objeto A precisa operar o banco de dados. No passado, sempre escrevemos código em A para obter um objeto de conexão. Com a primavera, precisamos dizer apenas à Spring que é necessária uma conexão em A. Quanto a como construir essa conexão e quando construí -la, a não precisa saber. Quando o sistema estiver em execução, a primavera criará uma conexão no momento apropriado e a injetará em uma injeção como uma injeção, completando assim o controle da relação entre cada objeto. Uma necessidade de confiar na conexão para executar normalmente, e essa conexão é injetada em uma primavera, e o nome da injeção de dependência vem disso. Então, como o DI é implementado? Um recurso importante após o Java 1.3 é a reflexão, que permite ao programa gerar dinamicamente objetos, executar métodos de objetos e alterar as propriedades dos objetos ao executar. A primavera é injetada através da reflexão.
A chave para entender DI é: "Quem depende de quem, por que você precisa depender disso, quem injeta quem e o que o injeta". Vamos analisá -lo em profundidade:
● Quem depende de quem: é claro, o aplicativo depende do contêiner do COI;
● Por que as dependências são necessárias: os aplicativos precisam de contêineres do IOC para fornecer recursos externos exigidos pelos objetos;
● Quem injeta quem: é óbvio que o contêiner do COI injeta um objeto do aplicativo, um objeto do qual o aplicativo depende;
● O que é injetado: é injetar recursos externos (incluindo objetos, recursos e dados constantes) necessários para um objeto.
Qual é a relação entre COI e DI? De fato, eles são descritos de diferentes ângulos do mesmo conceito. Como o conceito de inversão de controle é relativamente vago (talvez seja entendido como o nível de objetos de controle de contêineres, é difícil pensar em quem manterá as relações de objetos), em 2004, o mestre Martin Fowler deu um novo nome: "Injeção de dependência". Comparado com o COI, "injeção de dependência" descreve claramente "o objeto injetado depende do objeto de dependência de configuração do contêiner do IOC".
Resumir
De fato, todo mundo tem seu próprio entendimento do conceito de COI da primavera, e não há resposta padrão. A direção geral está certa.
O exposto acima é sobre entender a injeção de dependência e a inversão de controle na primavera. Espero que seja útil para todos. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!