Google Guice vs. PicoContainer para injeção de dependência


100

Minha equipe está pesquisando frameworks de injeção de dependência e está tentando decidir entre usar o Google-Guice e o PicoContainer.

Estamos procurando várias coisas em nossa estrutura:

  1. Uma pequena pegada de código - o que quero dizer com uma pequena pegada de código é que não queremos ter código de injeção de dependência em toda parte em nossa base de código. Se precisarmos refatorar no futuro, queremos que seja o mais fácil possível.
  2. Desempenho - quanta sobrecarga cada estrutura tem ao criar e injetar objetos?
  3. Facilidade de uso - existe uma grande curva de aprendizado? Precisamos escrever montes de código para fazer algo simples funcionar? Queremos ter o mínimo de configuração possível.
  4. Tamanho da comunidade - Comunidades maiores geralmente significam que um projeto continuará a ser mantido. Não queremos usar um framework e temos que consertar nossos próprios bugs;) Além disso, quaisquer perguntas que tenhamos ao longo do caminho podem (espero) ser respondidas pela comunidade de desenvolvedores / usuários do framework.

As comparações das duas estruturas com os critérios listados seriam muito apreciadas. Quaisquer experiências pessoais que ajudem a comparar os dois também seriam extremamente úteis.

Isenção de responsabilidade: eu sou bastante novo em injeção de dependência, então desculpe meu noob-ness se eu fiz uma pergunta que não seja pertinente a esta discussão.


Atualização: Você também pode querer considerar CDI 2.0 - Injeção de Contextos e Dependências para Java . Padronizado em JSR 365 a partir de 2017-04.
Basil Bourque de

Respostas:


115

Você pode querer incluir Spring em sua lista de frameworks de injeção de dependência que está considerando. Aqui estão algumas respostas às suas perguntas:

Acoplamento à estrutura

Pico - O Pico tende a desencorajar a injeção de setter, mas fora isso, suas classes não precisam saber sobre o Pico. É apenas a fiação que precisa saber (verdadeiro para todas as estruturas de DI).

Guice - o Guice agora suporta as anotações JSR 330 padrão , então você não precisa mais de anotações específicas do Guice em seu código. Spring também suporta essas anotações padrão. O argumento que os caras do Guice usam é que, sem um processador de anotações do Guice em execução, eles não deveriam ter um impacto se você decidir usar um framework diferente.

Spring - Spring visa permitir que você evite qualquer menção ao framework Spring em seu código. Como eles têm muitos outros ajudantes / utilitários, etc., a tentação de depender do código do Spring é muito forte.

atuação

Pico - Não estou muito familiarizado com as características de velocidade do Pico

Guice - O Guice foi desenhado para ser rápido e a comparação mencionada na referência tem alguns números. Certamente, se a velocidade é uma consideração primária, tanto o uso do Guice quanto a fiação manual deve ser considerada

Primavera - a primavera pode ser lenta. Tem havido trabalho para torná-lo mais rápido e usar a biblioteca JavaConfig deve acelerar as coisas.

Fácil de usar

Pico - Simples de configurar. Pico pode tomar algumas decisões de autowire para você. Não está claro como ele se adapta a projetos muito grandes.

Guice - Simples de configurar, basta adicionar anotações e herdar de AbstractModule para vincular as coisas. Escala bem para grandes projetos, pois a configuração é reduzida ao mínimo.

Spring - relativamente fácil de configurar, mas a maioria dos exemplos usa Spring XML como método de configuração. Os arquivos Spring XML podem se tornar muito grandes e complexos com o tempo e demorar para carregar. Considere o uso de uma combinação de injeção de dependência de mola e manivela para superar isso.

Tamanho da comunidade

Pico - Pequeno

Guice - Médio

Primavera - Grande

Experiência

Pico - Não tenho muita experiência com o Pico, mas não é um framework amplamente utilizado, então será mais difícil encontrar recursos.

Guice - Guice é um framework popular e seu foco na velocidade é bem-vindo quando você tem um grande projeto que está reiniciando muito em desenvolvimento. Tenho uma preocupação com a natureza distribuída da configuração, ou seja, não é fácil ver como todo o nosso aplicativo é montado. É um pouco como AOP a esse respeito.

Spring - geralmente é a minha escolha padrão. Dito isso, o XML pode se tornar complicado e a desaceleração resultante irritante. Muitas vezes acabo usando uma combinação de injeção de dependência artesanal e Spring. Quando você realmente precisa de configuração baseada em XML, Spring XML é muito bom. O Spring também se esforçou para tornar outras estruturas mais amigáveis ​​à injeção de dependência, o que pode ser útil porque eles costumam usar as melhores práticas ao fazer isso (JMS, ORM, OXM, MVC etc.).

Referências


1
O que aprendi (com outra pessoa em vez de usá-lo) é que o PicoContainer é mais leve do que o Guice. Além disso, olhando através do documento do PicoContainer, também parece ser mais simples de usar. Ele irá procurar dependências nos próprios construtores e você não precisa especificar qual construtor usar. Ele apenas usa um correspondente.
Kissaki

2
Sim, eu sou grande no PicoContainer agora. É apenas uma solução de "manter a simplicidade", mas funcionando, não posso deixar de ver o Spring tão inchado e desatualizado hoje em dia. O Guice também é legal (e tem um bom apoiador c / Google), mas acredito que o Pico também tenha mais funcionalidades / flexibilidade, sendo mais antigo. É bom ver boas alternativas para a configuração xml desagradável!
Manius

Em referência à descrição "não muito utilizada" do Pico acima, é verdade que não é tão popular como os outros, mas considerando que é mais pequeno / mais simples do que outras soluções, é muito menos provável que se depare com problemas invulgares. Se você fizer isso, há uma lista de discussão legal e muito responsiva. Além disso, o Pico é não invasivo (a menos que você decida usar anotações, é uma opção), você não precisa de anotações como Guice, o que significa menos trabalho conectando o código de injeção. (sim, eu sou tendencioso, mas Pico é simplesmente legal) Guice é certamente uma boa ferramenta de DI (melhor que Spring IMO), no entanto.
Manius

1
Eu uso o pico em uma série de projetos muito grandes (e de uso pesado) (centenas de tipos de componentes definidos em cada contêiner) e usei quase todos os seus vários recursos, e não poderia estar mais feliz com isso.
jhouse

2
Acabei de fazer um teste de desempenho simples com Guice / Spring / PicoContainer - Guice e PicoContainer são bastante semelhantes. Em alguns casos, Guice foi um pouco mais rápido. A primavera foi muito lenta em todos os casos.
Joshua Davis

25

A resposta apresentada por jamie.mccrindle é realmente muito boa, mas fiquei confuso por que Spring é a escolha padrão quando está bastante claro que alternativas superiores (Pico e Guice) estão disponíveis. A popularidade do IMO Spring atingiu seu pico e agora está vivendo do hype gerado (junto com todos os outros subprojetos "eu também" do Spring que procuram pegar o trem do Spring).

A única vantagem real do Spring é o tamanho da comunidade (e francamente, devido ao tamanho e complexidade, é necessário), mas Pico e Guice não precisam de uma grande comunidade porque sua solução é muito mais limpa, mais organizada e mais elegante. O Pico parece mais flexível do que o Guice (você pode usar anotações no Pico, ou não - é extremamente eficiente). (Editar: quer dizer que é extremamente flexível, não que também não seja eficiente.)

O tamanho minúsculo do Pico e a falta de dependências é uma vitória PRINCIPAL que não deve ser subestimada. Quantos megas você precisa baixar para usar o Spring agora? É uma bagunça confusa de arquivos jar enormes, com todas as suas dependências. Pensando intuitivamente, uma solução tão eficiente e "pequena" deve ser dimensionada e ter um desempenho melhor do que algo como o Spring. O inchaço da primavera realmente vai torná-lo melhor escalar? É este mundo bizarro? Eu não faria suposições de que o Spring é "mais escalável" até que isso seja provado (e explicado).

Às vezes, criar algo bom (Pico / Guice) e, em seguida, manter as MÃOS FORA disso em vez de adicionar recursos de inchaço e pia de cozinha com infinitas novas versões realmente funciona ...


1
Importa-se de dizer porque é que o Pico e o Guice são superiores à Primavera?
Thorbjørn Ravn Andersen

4
Achei que sim - basicamente, eles fazem DI tão bem, são mais simples / menores / mais limpos e nenhuma ou poucas dependências. Isso não quer dizer que o Spring nunca faça sentido (tenho certeza de que há casos), tudo o que estou dizendo é que mais simples é melhor se seus requisitos estiverem sendo atendidos. E para um grande número de projetos, pequenas bibliotecas de suporte são tudo o que você precisa.
Manius

12

NOTA: Isso é mais um comentário / retórica do que uma resposta

O PicoContainer é ótimo. Eu voltaria para ele se eles apenas consertassem seus sites. É muito confuso agora:

  • http://picocontainer.com que é o mais recente, mas muitas páginas têm problemas de formatação e algumas páginas não funcionam de todo. Parece que as páginas foram convertidas automaticamente do conteúdo mais antigo.
  • http://picocontainer.codehaus.org/ Que parece congelado no tempo na versão 2.10.2 - Seria muito bom se as páginas dissessem algo como "ei, você está olhando para um site antigo!"
  • http://docs.codehaus.org/display/PICO/Home - Um wiki de confluência que documenta a v 1.x, mas não diz isso em nenhuma parte das páginas!

Estou usando o Guice 2.x agora, embora seja maior e tenha menos recursos. Foi muito mais fácil encontrar a documentação e seu grupo de usuários é muito ativo. No entanto, se a direção do Guice 3 for qualquer indicação, parece que o Guice está começando a inchar, assim como a primavera fazia nos primeiros dias.

Atualização: Postei um comentário para o pessoal do Pico Container e eles fizeram algumas melhorias no site. Muito melhor agora!


Mas o site codehaus ainda está congelado e nenhuma informação sobre qualquer movimento. Achei que Pico estava morto;)
Vladislav Rastrusny

1
Se o site não estiver atualizado com o código, pode ser uma indicação de que o projeto está abaixo da massa crítica.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Sim. Infelizmente acho que o Pico foi substituído pelo Guice e pelo CDI.
Joshua Davis

5
Em 8 de março de 2013, o site picocontainer.org parecia estar ocupado por um invasor de domínio. picocontainer.com parece ser o site canônico agora.
dOxxx

2

É uma questão antiga, mas hoje você pode considerar Dagger ( https://github.com/square/dagger ) em seu projeto de aplicativo Android. Dagger gera código em tempo de compilação. Assim, você obtém um tempo de inicialização mais curto e menos uso de memória no tempo de execução.


Eu gosto do Dagger, mas parece que ainda não há um plug-in do Gradle nos repositórios públicos para projetos não Android (ou seja, um plug-in do Gradle para projetos java 'regulares'). Eu consideraria para projetos Java se houvesse um plugin nos repositórios públicos.
Joshua Davis

2

Se você está atrás de um contêiner de DI minimalista, pode dar uma olhada no Feather . Funcionalidade Vanilla JSR-330 DI apenas, mas muito boa em termos de pegada (16K, sem dependências) e desempenho. Funciona no Android.


Ei, Feather é incrível! Eu o usei para implementar um plugin DI para ActFramework . Fiz algumas atualizações, por exemplo, chamar injetFields automaticamente se necessário e suporte para ouvinte de injeção, deixe-me saber se você quer que eu envie uma solicitação de pull
Gelin Luo

@verde, vejo que você mudou para o Genie. Você poderia, por favor, compartilhar suas experiências de uso do Feather?
beerBear

1
@beerBear Feather é muito leve e muito fácil de usar na maioria dos casos de uso de DI. No entanto, como estou trabalhando em uma estrutura MVC fullstack, preciso de uma solução que implemente a especificação JSR330 completa. É por isso que me mudei para Genie
Gelin Luo

@green Agradeço sua postagem de explicação para um melhor entendimento.
beerBear

0

Embora eu goste do PicoContainer por sua simplicidade e falta de dependências. Eu recomendaria usar CDI em vez disso, porque ele faz parte do padrão Java EE, então você não tem dependência de fornecedor.

Em termos de intrusão, seu principal problema é a necessidade de um contêiner e o uso de um arquivo META-INF / beans.xml relativamente vazio (necessário para indicar que o jar está usando CDI) e o uso de anotações (embora sejam padrão )

O contêiner CDI leve que uso para meus próprios projetos é o Apache Open Web Beans. Embora tenha demorado um pouco para descobrir como criar um aplicativo simples (ao contrário do Pico) que se parece com isso.

public static void main(final String[] args) {
    final ContainerLifecycle lifecycle = WebBeansContext.currentInstance()
            .getService(ContainerLifecycle.class);
    lifecycle.startApplication(null);

    final BeanManager beanManager = lifecycle.getBeanManager();
    // replace Tester with your start up class
    final Bean<?> bean = beanManager.getBeans(Tester.class).iterator()
            .next();

    final Tester b = (Tester) lifecycle.getBeanManager().getReference(bean,
            Tester.class, beanManager.createCreationalContext(bean));
    b.doInit();
}

2
Se você ficar com o JSR-330 em seu código de biblioteca, poderá reduzir ao mínimo o código específico do contêiner.
Thorbjørn Ravn Andersen

Você ainda precisa de um código específico de contêiner em seu teste automatizado. Embora isso não signifique que você teria um código específico de contêiner em seu código real (e você não deve, de qualquer maneira, a menos que planeje executar seu próprio "principal", que em um aplicativo eu escrevi para mim mesmo.
Archimedes Trajano
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.