Padrão de estratégia de inversão de controle
Obter através da App Store Leia esta publicação em nosso aplicativo!
Alguém pode explicar como o padrão de estratégia se relaciona com a inversão de controle?
Alguém pode explicar exatamente como o padrão de estratégia se relaciona com a inversão de controle?
Quando você usa o padrão de estratégia, você quer que suas outras classes dependam da interface e não de uma estratégia concreta. Uma maneira de fazer isso é ter a estratégia concreta injetada em uma classe que a use como interface, em vez de ter a classe entender como criar a estratégia apropriada. É aqui que entra IoC / Dependency Injection.
A idéia seria que você tenha algum tipo de configuração ou classe de decisão que defina quais estratégias usar. Esta poderia ser uma estrutura de IoC, mas não necessariamente tem que ser. Esta classe é responsável por configurar suas outras classes com a estratégia apropriada com base no estado ou configuração do sistema. A estratégia concreta é criada e injetada através de um construtor ou construtor de propriedades e, portanto, "controle" sobre qual classe de estratégia é instanciado é "invertido" - não é feito pela classe dependendo dele, mas sim de fora.
Por si só, o padrão não introduz inversão de controle. Se o desenvolvedor do padrão implementá-lo de tal forma que o algoritmo swappable seja injetado no controlador, então isso é inversão. Se o implementador, por outro lado, obtém o algoritmo para usar de alguma outra fonte (como a configuração, ou o determina no construtor do controlador através de outros meios), então é apenas o tipo de corrida do moinho de código.
Nenhum COI é uma coisa diferente em conjunto, você pode ler mais sobre COI e DI aqui, obter a idéia real.
O COI pode ser considerado como um dos principais (fins) que pode ser alcançado usando o padrão de estratégia (meios), pois o padrão do servicelocator seria outra opção.
Padrão de estratégia de inversão de controle
Obter através da App Store Leia esta publicação em nosso aplicativo!
Inversão de Controle, Injeção de Dependência e Padrão de Estratégia com exemplos em java.
Muitas vezes, estou confundido com esses três termos. Estes três são semelhantes a mim. Alguém pode me explicar com clareza, com exemplos.
Eu já vi mensagens semelhantes e não entendi completamente.
A Injeção de Dependência refere-se ao padrão de dizer a uma classe quais serão suas dependências, em vez de exigir que a classe saiba onde encontrar todas as suas dependências.
Então, por exemplo, você passa disso:
para algo assim:
Isso reduz o acoplamento no código, o que é especialmente útil se você deseja testar o UserFetcher. Agora, em vez de UserFetcher sempre executado contra um banco de dados encontrado em 10.167.1.25, você pode passar em um DbConnection para um banco de dados de teste. Ou, ainda mais útil em um teste rápido, você pode passar em uma implementação ou subclasse de DbConnection que nem se conecta a um banco de dados, ele simplesmente descarta os pedidos!
No entanto, esse tipo de injeção de dependência primitiva faz com que a fiação (fornecendo um objeto com suas dependências) seja mais difícil, porque você substituiu o acesso à dependência usando uma variável global (ou um objeto instanciado localmente) com a passagem da dependência ao redor do gráfico do objeto inteiro .
Pense em um caso em que o UserFetcher é uma dependência do AccountManager, que é uma dependência do AdminConsole. Então, AdminConsole precisa passar a instância do DbConnection para o AccountManager e o AccountManager precisa passá-lo para o UserFetcher. mesmo se nem AdminConsole nem AccountManager precisam usar o DbConnection diretamente!
Uma inversão do recipiente de controle (Spring, Guice, etc.) visa facilitar a injeção de dependência através da fiação automática (fornecendo) as dependências. Para fazer isso, diga ao seu contêiner IoC uma vez como fornecer um objeto (na Primavera, isso é chamado de feijão) e sempre que outro objeto solicite essa dependência, ele será fornecido pelo contêiner.
Portanto, nosso último exemplo pode parecer isso com o Guice, se usássemos a injeção do construtor:
E temos que configurar o contêiner IoC. Em Guice, isto é feito através de uma implementação do Módulo; na Primavera você configura um contexto de aplicativo, muitas vezes através de XML.
Agora, quando o UserFetcher é construído por Guice ou Spring, o DbConnection é fornecido automaticamente.
Guice tem um artigo muito bom Wiki sobre a motivação por trás da injeção de dependência e o uso de um recipiente IoC. Vale a pena ler até o final.
O padrão de estratégia é apenas um caso especial de injeção de dependência, onde você injeta lógica em vez de um objeto (mesmo que em Java, a lógica seja encapsulada em um objeto). É uma forma de desacoplar lógica de negócios independente.
Por exemplo, você pode ter um código como este:
Mas e se você quisesse estender esse código a uma nova jurisdição, com um regime de imposto de vendas diferente? Você poderia injetar a lógica para calcular o imposto, assim:
A inversão de controle significa que uma estrutura de tempo de execução alinha todos os componentes em conjunto (por exemplo, Spring). A injeção de dependência é uma forma de IoC (não sei se existe outra forma de IoC) (veja: en. wikipedia. org/wiki/Inversion_of_control).
Padrão de estratégia é um padrão de design (definido pelo GoF) onde o algoritmo pode ser substituído por outro (veja: en. wikipedia. org/wiki/Strategy_pattern). Isso é arquivado por várias implementações de uma mesma interface. Ao usar um IoC como Spring, se você tiver várias implementações de uma interface, e se você pode alternar de uma implementação para outra por configuração, você está usando o padrão de estratégia.
Eu também recomendo ler o capítulo de introdução da documentação da Spring, que se concentra nesta questão: Introdução ao Spring Framework.
Os primeiros parágrafos devem fazer.
O que também fornece uma visão motivacional desses conceitos básicos muito importantes.
PocoCapsule: recipiente IoC para C ++
Terça-feira, 25 de março de 2008.
Padrão de Inversão de Controle vs Estratégia.
12 comentários:
Oi Ke - Talvez eu tenha entendido mal, mas você não diria que a Estratégia é uma forma de injeção de dependência? Como em, uma das possíveis técnicas disponíveis para implementar DI?
Padrão de estratégia também é ortogonal para DI. Certamente, DI (ou IoC) é muito popular na célula / injetar política ou objetos de algoritmo para seus contextos de usuário (como no exemplo do GoF). No entanto, esses objetos de política / algoritmo também podem ser resolvidos por seus contextos de usuário usando a pesquisa de registro de políticas / algoritmos, etc. A idéia fundamental da estratégia é abordar as lógicas do algoritmo em objetos de política de vinculação posterior, em vez de como esses objetos de política foram resolvidos (injeção e pesquisa). Portanto, não se pode afirmar que a resolução de políticas / algoritmo de objetos usando a pesquisa de diretório não era um padrão de estratégia.
Olá. Esta publicação é interessante, e seu blog é muito interessante, parabéns :-). Vou adicionar no meu blogroll =). Se possível, dá uma última no meu blog, trata-se do Massagem, espero que você goste. O endereço é massagem-brasil. blogspot. Um abraço.
Eu não acho que a Estratégia é ortogonal ao IoC, embora seja ortogonal ao DI. IoC é um conceito muito mais amplo do que DI, e acho que Martin Fowler faz um bom trabalho argumentando que mesmo as chamadas de retorno simples são IoC. Veja martinfowler / bliki / InversionOfControl. html.
Brian, estou confuso. Como poderia "IoC é ortogonal para DI" e "IoC é um conceito muito mais amplo do que DI" também? Se fossem ortogonais, comparando qual era mais amplo que outro dificilmente fazia sentido.
Seu blog continua ficando cada vez melhor! Seus artigos mais antigos não são tão bons quanto os mais novos, você tem muito mais criatividade e originalidade, continue assim!
Você testou e escreveu sua experiência pessoal ou você encontra alguma informação online?
Introdução ao Controle de Inversão e Injeção de Dependência com Primavera.
Última modificação: 28 de dezembro de 2016.
Acabei de anunciar os novos módulos Spring 5 no REST With Spring:
1. Visão Geral.
Neste artigo, iremos introduzir os conceitos de IoC (Inversion of Control) e DI (Dependency Injection), e então examinaremos como eles são implementados no framework Spring.
2. O que é Inversão de Controle?
Inversão de Controle é um princípio na engenharia de software pelo qual o controle de objetos ou partes de um programa é transferido para um contêiner ou estrutura. É mais frequentemente utilizado no contexto da programação orientada a objetos.
Em contraste com a programação tradicional, em que nosso código personalizado faz chamadas para uma biblioteca, o IoC permite que uma estrutura controle o fluxo de um programa e faça chamadas para o nosso código personalizado. Para tornar isso possível, as estruturas são definidas através de abstrações com comportamento adicional incorporado. Se quisermos adicionar nosso próprio comportamento, precisamos estender as classes da estrutura ou fazer o plugin nas nossas próprias classes.
As vantagens desta arquitetura são:
desacoplando a execução de uma tarefa da sua implementação, facilitando a troca entre diferentes implementações, maior modularidade de um programa, maior facilidade no teste de um programa, isolando um componente ou zombando de suas dependências e permitindo que os componentes se comuniquem através de contratos.
A inversão de controle pode ser alcançada através de vários mecanismos, tais como: padrão de design de estratégia, padrão de Localizador de serviços, padrão de fábrica e Injeção de dependência (DI).
Nós vamos olhar para DI em seguida.
3. O que é a Injeção de Dependência?
A injeção de dependência é um padrão através do qual implementar IoC, onde o controle sendo invertido é a configuração das dependências do objeto.
O ato de conectar objetos com outros objetos, ou "injetar" # 8221; objetos em outros objetos, é feito por um montador e não pelos próprios objetos.
Aqui é como você criaria uma dependência de objeto na programação tradicional:
No exemplo acima, você pode ver que, para instanciar a dependência do item de um objeto Store, você deve especificar qual a implementação do item de interface que usaremos na própria classe da loja.
Ao usar DI, podemos reescrever o exemplo sem especificar a implementação do item que queremos:
A implementação do Item a ser injetado será fornecida através de metadados, como veremos nos exemplos abaixo.
Ambos, IoC e DI são conceitos simples, mas têm implicações profundas na forma como estruturamos nossos sistemas, então eles valem a pena entender bem.
4. O recipiente Spring IoC.
Um recipiente IoC é uma característica comum de frameworks que implementam o IoC.
Na estrutura Spring, o contêiner IoC é representado pela interface ApplicationContext. O recipiente Spring é responsável por instanciar, configurar e montar objetos conhecidos como beans, bem como gerenciar seu ciclo de vida.
A estrutura Spring fornece várias implementações da interface ApplicationContext - ClassPathXmlApplicationContext e FileSystemXmlApplicationContext para aplicativos autônomos e WebApplicationContext para aplicativos da web.
Para montar feijão, o contêiner usa metadados de configuração, que podem ser na forma de configuração XML ou anotações.
Aqui está uma maneira de instanciar manualmente um recipiente:
5. Injeção de dependência na primavera.
Para definir o atributo de item no exemplo acima, podemos usar metadados que serão usados para montar objetos em tempo de execução pelo contêiner Spring.
A Injeção de Dependência na Primavera pode ser feita através de construtores ou setters.
5.1. Injeção de dependência baseada em construtor.
No caso da injeção de dependência baseada em construtor, o contêiner invocará um construtor com argumentos cada um representando uma dependência que queremos definir.
Resolver cada argumento é feito principalmente pelo tipo de argumento, seguido pelo nome do atributo e índice de desambiguação. A configuração de um feijão e suas dependências pode ser feita com as anotações:
A anotação de configuração indica que a classe é uma fonte de definições de beans e pode ser usada em várias classes de configuração. A anotação Bean é usada em um método para definir um feijão. Se você não especificar um nome personalizado, o nome do método será usado.
Se estiver usando o escopo singleton padrão para um bean, cada vez que um método anotado com o Bean é chamado, a Spring verifica primeiro se uma instância em cache do bean já existe e só cria uma nova se não existir. Se o escopo do protótipo for especificado, uma nova instância do bean será retornada para cada chamada do método.
Outra maneira de criar a configuração dos beans é através da configuração XML:
5.2. Injeção de dependência baseada em setter.
Para o DI baseado em setter, o contêiner chamará métodos de setter de sua classe, depois de invocar um construtor sem argumento ou um método de fábrica estático sem argumento para instanciar o bean. Deixe criar esta configuração usando as anotações:
Nós também podemos usar XML para a mesma configuração de beans:
Os tipos de injeção baseados em construtores e baseados em setter podem ser combinados para o mesmo feijão. Recomenda-se pela documentação da Primavera usar injeção baseada em construtor para dependências obrigatórias e injeção baseada em setter para opções opcionais.
5.3. Dependências de autenticação automática.
A fiação permite que o recipiente Spring resolva automaticamente as dependências entre feixes colaboradores, inspecionando o feijão que foi definido.
Existem quatro modos de autenticação de um bean usando uma configuração XML:
não: o valor padrão & # 8211; isso significa que não é utilizada nenhuma autenticação automática para o bean e as dependências devem ser explicitamente nomeadas por Nome: a autenticação é feita com base no nome da propriedade; portanto, a Spring procurará um bean com o mesmo nome que a propriedade que precisa ser definida por Tipo : semelhante ao byName autowiring, apenas com base no tipo da propriedade, o que significa que a Spring procurará um bean com o mesmo tipo de propriedade a ser definida; se for encontrado mais de um feijão desse tipo, o framework lança um construtor de exceção: a autenticação é feita com base em argumentos do construtor, o que significa que a Spring buscará beans com o mesmo tipo de argumentos do construtor.
Por exemplo, deixe automaticamente o feixe item1 definido acima por tipo no feixe da loja:
Você também pode injetar beans usando a anotação Autowired para autenticação por tipo:
Se houver mais de um feijão do mesmo tipo, você pode adicionar a anotação Qualifier para fazer referência a um bean pelo nome:
Deixe o autowire beans por tipo através da configuração XML:
Agora, insira um bean chamado item na propriedade do item do bean da loja pelo nome através do XML:
Você também pode substituir a autenticação automática definindo dependências explicitamente através de argumentos ou setters do construtor.
5.4. Feijão inicializado preguiçoso.
Por padrão, o recipiente cria e configura todos os beans singleton durante a inicialização. Para evitar isso, você pode especificar o atributo lazy-init com valor verdadeiro na configuração do bean:
Como conseqüência, o feitiço item1 será inicializado somente quando for solicitado pela primeira vez, e não na inicialização. A vantagem disso é o tempo de inicialização mais rápido, mas o trade-off é que os erros de configuração podem ser descobertos somente depois que o bean é solicitado, o que pode ser várias horas ou mesmo dias após o aplicativo já estar sendo executado.
6. Conclusão.
Neste artigo, apresentamos os conceitos de inversão de controle e injeção de dependência e os exemplificamos no framework Spring.
Você pode ler mais sobre esses conceitos nos artigos de Martin Fowler # 8217:
E você pode aprender mais sobre as implementações Spring do IoC e DI na Documentação de Referência da Spring Framework.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Inversão de Controle, Injeção de Dependência e Padrão de Estratégia com exemplos em java.
Muitas vezes, estou confundido com esses três termos. Estes três são semelhantes a mim. Alguém pode me explicar com clareza, com exemplos.
Eu já vi mensagens semelhantes e não entendi completamente.
A Injeção de Dependência refere-se ao padrão de dizer a uma classe quais serão suas dependências, em vez de exigir que a classe saiba onde encontrar todas as suas dependências.
Então, por exemplo, você passa disso:
para algo assim:
Isso reduz o acoplamento no código, o que é especialmente útil se você deseja testar o UserFetcher. Agora, em vez de UserFetcher sempre executado contra um banco de dados encontrado em 10.167.1.25, você pode passar em um DbConnection para um banco de dados de teste. Ou, ainda mais útil em um teste rápido, você pode passar em uma implementação ou subclasse de DbConnection que nem se conecta a um banco de dados, ele simplesmente descarta os pedidos!
No entanto, esse tipo de injeção de dependência primitiva faz com que a fiação (fornecendo um objeto com suas dependências) seja mais difícil, porque você substituiu o acesso à dependência usando uma variável global (ou um objeto instanciado localmente) com a passagem da dependência ao redor do gráfico do objeto inteiro .
Pense em um caso em que o UserFetcher é uma dependência do AccountManager, que é uma dependência do AdminConsole. Então, AdminConsole precisa passar a instância do DbConnection para o AccountManager e o AccountManager precisa passá-lo para o UserFetcher. mesmo se nem AdminConsole nem AccountManager precisam usar o DbConnection diretamente!
Uma inversão do recipiente de controle (Spring, Guice, etc.) visa facilitar a injeção de dependência através da fiação automática (fornecendo) as dependências. Para fazer isso, diga ao seu contêiner IoC uma vez como fornecer um objeto (na Primavera, isso é chamado de feijão) e sempre que outro objeto solicite essa dependência, ele será fornecido pelo contêiner.
Portanto, nosso último exemplo pode parecer isso com o Guice, se usássemos a injeção do construtor:
E temos que configurar o contêiner IoC. Em Guice, isto é feito através de uma implementação do Módulo; na Primavera você configura um contexto de aplicativo, muitas vezes através de XML.
Agora, quando o UserFetcher é construído por Guice ou Spring, o DbConnection é fornecido automaticamente.
Guice tem um artigo muito bom Wiki sobre a motivação por trás da injeção de dependência e o uso de um recipiente IoC. Vale a pena ler até o final.
O padrão de estratégia é apenas um caso especial de injeção de dependência, onde você injeta lógica em vez de um objeto (mesmo que em Java, a lógica seja encapsulada em um objeto). É uma forma de desacoplar lógica de negócios independente.
Por exemplo, você pode ter um código como este:
Mas e se você quisesse estender esse código a uma nova jurisdição, com um regime de imposto de vendas diferente? Você poderia injetar a lógica para calcular o imposto, assim:
A inversão de controle significa que uma estrutura de tempo de execução alinha todos os componentes em conjunto (por exemplo, Spring). A injeção de dependência é uma forma de IoC (não sei se existe outra forma de IoC) (veja: en. wikipedia. org/wiki/Inversion_of_control).
Padrão de estratégia é um padrão de design (definido pelo GoF) onde o algoritmo pode ser substituído por outro (veja: en. wikipedia. org/wiki/Strategy_pattern). Isso é arquivado por várias implementações de uma mesma interface. Ao usar um IoC como Spring, se você tiver várias implementações de uma interface, e se você pode alternar de uma implementação para outra por configuração, você está usando o padrão de estratégia.
Eu também recomendo ler o capítulo de introdução da documentação da Spring, que se concentra nesta questão: Introdução ao Spring Framework.
Os primeiros parágrafos devem fazer.
O que também fornece uma visão motivacional desses conceitos básicos muito importantes.
PocoCapsule: recipiente IoC para C ++
Terça-feira, 25 de março de 2008.
Padrão de Inversão de Controle vs Estratégia.
12 comentários:
Oi Ke - Talvez eu tenha entendido mal, mas você não diria que a Estratégia é uma forma de injeção de dependência? Como em, uma das possíveis técnicas disponíveis para implementar DI?
Padrão de estratégia também é ortogonal para DI. Certamente, DI (ou IoC) é muito popular na célula / injetar política ou objetos de algoritmo para seus contextos de usuário (como no exemplo do GoF). No entanto, esses objetos de política / algoritmo também podem ser resolvidos por seus contextos de usuário usando a pesquisa de registro de políticas / algoritmos, etc. A idéia fundamental da estratégia é abordar as lógicas do algoritmo em objetos de política de vinculação posterior, em vez de como esses objetos de política foram resolvidos (injeção e pesquisa). Portanto, não se pode afirmar que a resolução de políticas / algoritmo de objetos usando a pesquisa de diretório não era um padrão de estratégia.
Olá. Esta publicação é interessante, e seu blog é muito interessante, parabéns :-). Vou adicionar no meu blogroll =). Se possível, dá uma última no meu blog, trata-se do Massagem, espero que você goste. O endereço é massagem-brasil. blogspot. Um abraço.
Eu não acho que a Estratégia é ortogonal ao IoC, embora seja ortogonal ao DI. IoC é um conceito muito mais amplo do que DI, e acho que Martin Fowler faz um bom trabalho argumentando que mesmo as chamadas de retorno simples são IoC. Veja martinfowler / bliki / InversionOfControl. html.
Brian, estou confuso. Como poderia "IoC é ortogonal para DI" e "IoC é um conceito muito mais amplo do que DI" também? Se fossem ortogonais, comparando qual era mais amplo que outro dificilmente fazia sentido.
Seu blog continua ficando cada vez melhor! Seus artigos mais antigos não são tão bons quanto os mais novos, você tem muito mais criatividade e originalidade, continue assim!
Você testou e escreveu sua experiência pessoal ou você encontra alguma informação online?
Introdução ao Controle de Inversão e Injeção de Dependência com Primavera.
Última modificação: 28 de dezembro de 2016.
Acabei de anunciar os novos módulos Spring 5 no REST With Spring:
1. Visão Geral.
Neste artigo, iremos introduzir os conceitos de IoC (Inversion of Control) e DI (Dependency Injection), e então examinaremos como eles são implementados no framework Spring.
2. O que é Inversão de Controle?
Inversão de Controle é um princípio na engenharia de software pelo qual o controle de objetos ou partes de um programa é transferido para um contêiner ou estrutura. É mais frequentemente utilizado no contexto da programação orientada a objetos.
Em contraste com a programação tradicional, em que nosso código personalizado faz chamadas para uma biblioteca, o IoC permite que uma estrutura controle o fluxo de um programa e faça chamadas para o nosso código personalizado. Para tornar isso possível, as estruturas são definidas através de abstrações com comportamento adicional incorporado. Se quisermos adicionar nosso próprio comportamento, precisamos estender as classes da estrutura ou fazer o plugin nas nossas próprias classes.
As vantagens desta arquitetura são:
desacoplando a execução de uma tarefa da sua implementação, facilitando a troca entre diferentes implementações, maior modularidade de um programa, maior facilidade no teste de um programa, isolando um componente ou zombando de suas dependências e permitindo que os componentes se comuniquem através de contratos.
A inversão de controle pode ser alcançada através de vários mecanismos, tais como: padrão de design de estratégia, padrão de Localizador de serviços, padrão de fábrica e Injeção de dependência (DI).
Nós vamos olhar para DI em seguida.
3. O que é a Injeção de Dependência?
A injeção de dependência é um padrão através do qual implementar IoC, onde o controle sendo invertido é a configuração das dependências do objeto.
O ato de conectar objetos com outros objetos, ou "injetar" # 8221; objetos em outros objetos, é feito por um montador e não pelos próprios objetos.
Aqui é como você criaria uma dependência de objeto na programação tradicional:
No exemplo acima, você pode ver que, para instanciar a dependência do item de um objeto Store, você deve especificar qual a implementação do item de interface que usaremos na própria classe da loja.
Ao usar DI, podemos reescrever o exemplo sem especificar a implementação do item que queremos:
A implementação do Item a ser injetado será fornecida através de metadados, como veremos nos exemplos abaixo.
Ambos, IoC e DI são conceitos simples, mas têm implicações profundas na forma como estruturamos nossos sistemas, então eles valem a pena entender bem.
4. O recipiente Spring IoC.
Um recipiente IoC é uma característica comum de frameworks que implementam o IoC.
Na estrutura Spring, o contêiner IoC é representado pela interface ApplicationContext. O recipiente Spring é responsável por instanciar, configurar e montar objetos conhecidos como beans, bem como gerenciar seu ciclo de vida.
A estrutura Spring fornece várias implementações da interface ApplicationContext - ClassPathXmlApplicationContext e FileSystemXmlApplicationContext para aplicativos autônomos e WebApplicationContext para aplicativos da web.
Para montar feijão, o contêiner usa metadados de configuração, que podem ser na forma de configuração XML ou anotações.
Aqui está uma maneira de instanciar manualmente um recipiente:
5. Injeção de dependência na primavera.
Para definir o atributo de item no exemplo acima, podemos usar metadados que serão usados para montar objetos em tempo de execução pelo contêiner Spring.
A Injeção de Dependência na Primavera pode ser feita através de construtores ou setters.
5.1. Injeção de dependência baseada em construtor.
No caso da injeção de dependência baseada em construtor, o contêiner invocará um construtor com argumentos cada um representando uma dependência que queremos definir.
Resolver cada argumento é feito principalmente pelo tipo de argumento, seguido pelo nome do atributo e índice de desambiguação. A configuração de um feijão e suas dependências pode ser feita com as anotações:
A anotação de configuração indica que a classe é uma fonte de definições de beans e pode ser usada em várias classes de configuração. A anotação Bean é usada em um método para definir um feijão. Se você não especificar um nome personalizado, o nome do método será usado.
Se estiver usando o escopo singleton padrão para um bean, cada vez que um método anotado com o Bean é chamado, a Spring verifica primeiro se uma instância em cache do bean já existe e só cria uma nova se não existir. Se o escopo do protótipo for especificado, uma nova instância do bean será retornada para cada chamada do método.
Outra maneira de criar a configuração dos beans é através da configuração XML:
5.2. Injeção de dependência baseada em setter.
Para o DI baseado em setter, o contêiner chamará métodos de setter de sua classe, depois de invocar um construtor sem argumento ou um método de fábrica estático sem argumento para instanciar o bean. Deixe criar esta configuração usando as anotações:
Nós também podemos usar XML para a mesma configuração de beans:
Os tipos de injeção baseados em construtores e baseados em setter podem ser combinados para o mesmo feijão. Recomenda-se pela documentação da Primavera usar injeção baseada em construtor para dependências obrigatórias e injeção baseada em setter para opções opcionais.
5.3. Dependências de autenticação automática.
A fiação permite que o recipiente Spring resolva automaticamente as dependências entre feixes colaboradores, inspecionando o feijão que foi definido.
Existem quatro modos de autenticação de um bean usando uma configuração XML:
não: o valor padrão & # 8211; isso significa que não é utilizada nenhuma autenticação automática para o bean e as dependências devem ser explicitamente nomeadas por Nome: a autenticação é feita com base no nome da propriedade; portanto, a Spring procurará um bean com o mesmo nome que a propriedade que precisa ser definida por Tipo : semelhante ao byName autowiring, apenas com base no tipo da propriedade, o que significa que a Spring procurará um bean com o mesmo tipo de propriedade a ser definida; se for encontrado mais de um feijão desse tipo, o framework lança um construtor de exceção: a autenticação é feita com base em argumentos do construtor, o que significa que a Spring buscará beans com o mesmo tipo de argumentos do construtor.
Por exemplo, deixe automaticamente o feixe item1 definido acima por tipo no feixe da loja:
Você também pode injetar beans usando a anotação Autowired para autenticação por tipo:
Se houver mais de um feijão do mesmo tipo, você pode adicionar a anotação Qualifier para fazer referência a um bean pelo nome:
Deixe o autowire beans por tipo através da configuração XML:
Agora, insira um bean chamado item na propriedade do item do bean da loja pelo nome através do XML:
Você também pode substituir a autenticação automática definindo dependências explicitamente através de argumentos ou setters do construtor.
5.4. Feijão inicializado preguiçoso.
Por padrão, o recipiente cria e configura todos os beans singleton durante a inicialização. Para evitar isso, você pode especificar o atributo lazy-init com valor verdadeiro na configuração do bean:
Como conseqüência, o feitiço item1 será inicializado somente quando for solicitado pela primeira vez, e não na inicialização. A vantagem disso é o tempo de inicialização mais rápido, mas o trade-off é que os erros de configuração podem ser descobertos somente depois que o bean é solicitado, o que pode ser várias horas ou mesmo dias após o aplicativo já estar sendo executado.
6. Conclusão.
Neste artigo, apresentamos os conceitos de inversão de controle e injeção de dependência e os exemplificamos no framework Spring.
Você pode ler mais sobre esses conceitos nos artigos de Martin Fowler # 8217:
E você pode aprender mais sobre as implementações Spring do IoC e DI na Documentação de Referência da Spring Framework.
Comments
Post a Comment