10 enganos comuns sobre o framework Spring

Uma ótima listinha com erros e enganos comuns a ditos ou “pensados” por quem ainda não conhece o framework Spring saiu no OnJava:

  1. O Spring não é leve. Ele tenta fazer de tudo e está se tornando “gordo”.
  2. O Spring é um “tiro no pé” para pequenos projetos.
  3. O Spring não é escalável para aplicações grandes.
  4. O Spring força você a utilizar programação orientada a aspectos (que é uma coisa experimental).
  5. O Spring substitui o Java EE.
  6. Spring e EJB são mutuamente exclusivos.
  7. O Spring não pode se aproveitar das novidades do Java 5 como o EJB.
  8. Para grandes aplicações, a configuração do Spring pode se tornar um pesadelo para manutenção.
  9. Spring faz tudo por reflexão, por isso ele é lento.
  10. O Spring MVC é extremamente complexo, diferentemente do resto do Spring.

Lista completa (com comentários): OnJava - Ten Common Misconceptions About Spring…

Só alguns comentários com a minha opinião (não quer dizer que seja verdade, é só a minha opinião :smiley: )

[quote=Maurício Linhares]Uma ótima listinha com erros e enganos comuns a ditos ou “pensados” por quem ainda não conhece o framework Spring saiu no OnJava:

  1. O Spring não é leve. Ele tenta fazer de tudo e está se tornando “gordo”.
    [/quote]
    O core do spring é bem leve, e tu só precisa usar os componentes que tu quiser …
    mas realmente ele esta se tornando “gordo”

não acho que seja, principalmente quando ja tem um exemplo parecido pronto …
Utilizei o spring-annotation para fazer um sisteminha de controle de inscrições para eventos do RSJUG, menos de 10h de trabalho, ou seja um sisteminha beem pequeno …
7 ou 8 cadastros, …
e poupei muito tempo usando o spring-annotation, e por consequencia o spring.

verdade …
se tu precisar de objetos distribuidos, o spring não vai te dar isto …

não acho que AOP seja um problema …
mas a maior parte dos usuários do spring não faz ideia que esta usando AOP por traz …
mas se for pensar assim …
EJB3 te força a usar AOP também …

nops …
Java EE faz coisas que spring não faz … :smiley:

também não é verdade …
acessar EJBs de dentro do spring é até beem fácil :smiley:
antes do EJB3 era até mais fácil do que via código java …

não é verdade …
o spring-annotation esta ai pra provar o contrário …
e na proxima versão ja vai conter anotações compativeis com Java EE 5 :smiley:

isto é verdade …
e também um dos motivos que iniciei o desenvolvimento do spring-annotation :smiley:

não acho ele lento, pelo menos não chegou a ser visivel nas situações em que usei ele …
mas também não fiz nenhum benchmark …

yeap, verdade …
o Spring MVC é extremamente complexo, tem uma tonelada de recursos …
com certeza mesmo no caso mais simples, ele é mais complicado que o necessário :S

a não ser se for utilizaro o spring-annotation :smiley:

@Bean
@UrlMapping("/index.do")
public class QualquerNome implements Controller{....}

mas com certeza o spring não é a solução para todos os problemas da humanidade :smiley:

Assim, só pra constar mesmo, isso é uma lista de coisas erradas que as pessoas que não conhecem costumam pensar sobre o Spring. Não uma lista dos problemas reais do Spring.

tem coisas listadas ali que realmente são problemas, e outras que estou tentando resolver com o spring annotation :smiley:

[quote=urubatan]
yeap, verdade …
o Spring MVC é extremamente complexo, tem uma tonelada de recursos …
com certeza mesmo no caso mais simples, ele é mais complicado que o necessário :S[/quote]

Olá,

eu também achava um pouco complexo, mas acho que mudei de idéia. Vejam isso: http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html#mvc-coc

Fiz a combinação das convenções + MultiActionController, e achei louco!

yeap ta ficando beem legal mesmo :smiley:
mas acho que por mais fácil que fique, sempre vai ser dificil demais :smiley:
o ideal era não precisarmos nos preocupar com isto :smiley:

[quote=urubatan]yeap ta ficando beem legal mesmo :smiley:
mas acho que por mais fácil que fique, sempre vai ser dificil demais :smiley:
o ideal era não precisarmos nos preocupar com isto :smiley:
[/quote]

Eu nao sei pq mas nunca gostei do Spring MVC, sempre preferi o WebWork.
Mas vou dar uma olhada nesse link melhor parece que ta mudando o esquema. :stuck_out_tongue:

Fala Urubatan…

Eu vou comentar um pouco sobre a sua opinião… ok?

Como assim se tornando “gordo”? O que é um framework “leve” pra você?

Um framework “leve” (lightweight) é um framework não intrusivo, isto é, não requer que classes da aplicação (domain model) fiquem “penduradas” nas interfaces/classes do framework (POJO). É exatamente o que o EJB não é, pelo menos até a versão 3! Assim, um framework não deixa de ser “leve” pelo seu tamanho. Enquanto Spring seguir essa filosofia, ele será considerado “leve” sim.

O fato de Spring não trabalhar com Objetos Distribuidos não tira a escalabilidade de uma aplicação. Sem contar que distribuição de objetos é um assunto muito questionável (o livro ‘J2EE Development without EJB’, do Rod Johnson fala melhor sobre isso).
Portanto, não vejo onde ele perde em escalabilidade.

Bom amigos, após o terceiro projetinho com o Spring, fica aqui algumas impressões:

  • Realmente para aplicações de médio porte, você começa a sentir que a manutenibilidade da aplicação é bastante prejudicada pela configuração e se você não adotar algumas convenções, fica difícil pegar o erro.

-MVC do Spring funciona muito bem, mas carece de uma revisão e melhoria em partes comuns, como métodos bind, getErrors, que você tem no SimpleFormController, mas quando vai usar o MultiActionController não os têm e vice-versa - caso do bind para o SimpleFormController (Existe até um parecido - bindAndValidate).

O que sugeria é a padronização da camada de infra-estrutura.

  • Validator, você pode usar de uma determinada forma com alguns controllers - SimpleForm por exemplo e não pode usar no MultiAction. Exige outro formato de implementação que não é documentado, apenas referenciado em Apis - JavaDocs … isso é um saco.

IoC - Se não tomar bastante cuidado, vai ter uma porrada de interfaces para classes de business, daos, e cruzamento das mesmas em várias implementações, como numa classe de business, que vai fazer uso de diversas outras interfaces de business e se não tiver tudo bem amarrado no xml, pau … isso pode ser perigoso.

Ponto positivo é o debug com log4j, depois de alguns erros, você acaba sacando onde está o problema e vai direto ao ponto.

JSTL - TagBind, tem sérios problemas, e falta uma estrutura MVC na camada view.

PS: Depois termino, preciso sair fora do escritório, estou sozinho e o tiozinho aqui quer fechar :stuck_out_tongue:

[quote=Kenobi]
JSTL - TagBind, tem sérios problemas, e falta uma estrutura MVC na camada view. [/quote]

Não seria isso aqui o que voce precisa? http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html#mvc-formtaglib

Se voce está falando de XMLs, concordo em partes, principalmente se não quebra-los por módulos, camadas, etc etc, sendo que a melhor estratégia varia de projeto pra projeto. Mas se a manutenibilidade da sua aplicação está ficando complicada, talvez seja hora de revisar a sua estratégia.
Como voce esta dividindo seus modulos nos XMLs?
Ah… e quais erros que sao dificies de pegar?

Bom, SimpleFormController e MultiActionController são coisas bem distintas!
Mas, de qualquer maneira, talvez o que esteja procurando seja um ‘MultiActionFormController’ (http://opensource.atlassian.com/projects/spring/browse/SPR-1606).

Não entendi…
como numa classe de business, que vai fazer uso de diversas outras interfaces de business”… como assim? O que é perigoso?

Isso é o que todo bom framework tem!

O que é TagBind? E quais os sérios problemas?

Na versão 2.0 temos o form tag library.

[quote=Gerson]Fala Urubatan…

Eu vou comentar um pouco sobre a sua opinião… ok?
[/quote]
OK, sem problemas :smiley:

Por este ponto de vista, eu estava comparando o tamanho do framework só :smiley:

Posso ter me expressado mal, o que eu disse foi "se voce precisar de objetos distribuidos"
até o momento vejo poucas ocasiões onde isto é realmente necessário :smiley:
e até quando é, normalmente chamo um EJB de dentro do contexto do spring :smiley:

Eu gosto muito do spring, faço sempre palestras sobre ele (inclusive vo fazer uma no proximo JustJava, e uma sobre Spring-Annotation no proximo tutorial do RSJUG.
Uso Spring em praticamente todos os projetos em que tenho trabalhado nos ultimos 2 anos :smiley:

mas realmente acho que ele precisa melhorar em alguns pontos :smiley:

e este é o meu foco com o projeto Spring-Annotation :smiley:

Hummm… se o Spring tem tantos defeitinhos que podem prejudicar o futuro do projeto, qual outro framework vcs acham que esta muito bem estruturado alem de ter facil manutenbilidade e coisas do tipo?? seria o JSF???

JSF != Spring

mas algo similar ao spring que tenho vontade de aprender seria o Hivemind, apesar do Spring ser mais abrangente.

Segue uma comparação que achei no google: http://howardlewisship.com/blog/2004/02/comparing-hivemind-to-spring.html

Bom, eu não conheço bem esse seu projeto Spring-Annotation, mas, a principio, o que não me agrada é o fato de parecer mais um Dependency Lookup (Service Locator) do que Dependency Injection, já que o componente está, ativamente, solicitando (mesmo que não seja via código diretamente) sua dependencia para o container (usando @Property do Spring-Annotation). Usando Dependency Injection, o componente que precisa das dependencias é passivo (nao é ele que “corre atrás” de suas dependencias), o que não ocorre com o Spring-Annotation. Prefiro que o componente não fique responsável por saber quem são suas dependencias… acho que @Property(ref=“dependenciaBean”) quebra a DI.

[quote]
Bom, SimpleFormController e MultiActionController são coisas bem distintas!
Mas, de qualquer maneira, talvez o que esteja procurando seja um ‘MultiActionFormController’ (http://opensource.atlassian.com/projects/spring/browse/SPR-1606).[/quote]

Esse é o problema !! Eu conheço a hierarquia e ambos controllers são utilizados para tarefas parecidas, a diferença que no multiaction você pode ter concentrado num mesmo vários métodos e expor diretamente à aplicação, concentrando recursos num controller.

Sou fã de uma revisão como o proposto no link, realmente não acredito que tinha necesssidade de ser tão diferente, poderiam concentrar os serviços - infra na base e depois tudo bem mudar a hierarquia.

:idea:

[quote=Kenobi]

[quote]
Bom, SimpleFormController e MultiActionController são coisas bem distintas!
Mas, de qualquer maneira, talvez o que esteja procurando seja um ‘MultiActionFormController’ (http://opensource.atlassian.com/projects/spring/browse/SPR-1606).[/quote]

Esse é o problema !! Eu conheço a hierarquia e ambos controllers são utilizados para tarefas parecidas, a diferença que no multiaction você pode ter concentrado num mesmo vários métodos e expor diretamente à aplicação, concentrando recursos num controller.

Sou fã de uma revisão como o proposto no link, realmente não acredito que tinha necesssidade de ser tão diferente, poderiam concentrar os serviços - infra na base e depois tudo bem mudar a hierarquia.

:idea: [/quote]

Tinha sim!
Aí que tá, a diferença entre SimpleFormController e MultiActionController é muito mais que ''ter concentrado num mesmo vários métodos e expor diretamente à aplicação!
SimpleFormController foi criado para se trabalhar com formulário. Dê uma olhada no workflow em sua superclasse para entender a diferença:
http://www.springframework.org/docs/api/org/springframework/web/servlet/mvc/AbstractFormController.html#workflow
Já o MultiActionController é totalmente diferente, não está relacionado com um formulário. Dá até pra fazer binding também, mas não é binding de dados de um formulário. Ele, por exemplo, não diferencia uma submissão (normalmente método post) de uma requisição de formulário (normalmente get). É isso que precisa entender. Senão vai achar que tudo isso é loucura mesmo por serem tão diferentes. No Struts, por ex, os controller são todos iguais, independente de trabalhar ou não com formulário. O que muda é um raios de ActionForm associado no struts-config.xml.

Então, o que vc deve estar sentido falta no Spring é um controller que trabalhe com Form e ao mesmo tempo trabalhe com vários métodos como no MultiActionController, que é justamente a solicitação colocada no JIRA.

[quote=Gerson][quote=Kenobi]

Pode ser que tenha outra utilização, mas seria um pé no saco para um CRUD vc ter 3 ou 4 Controllers.

Acho que comeram bola nessa questão e espero que a solicitação do Jira seja atendida :slight_smile:

Bom, para te ajudar enquanto não tem nada igual, como o command é o mesmo, sobreescreva o onSubmit() do SimpleFormController, faça a injeção de um MethodNameResolver, e use-o para determinar o método a ser chamado dentro do seu único Controller de acordo com a URL ou algum parametro.

[quote=Gerson][quote=Kenobi]

Pode ser que tenha outra utilização, mas seria um pé no saco para um CRUD vc ter 3 ou 4 Controllers.

Acho que comeram bola nessa questão e espero que a solicitação do Jira seja atendida :slight_smile:

[/quote]

Bom, para te ajudar enquanto não tem nada igual, como o command é o mesmo, sobreescreva o onSubmit() do SimpleFormController, faça a injeção de um MethodNameResolver, e use-o para determinar o método a ser chamado dentro do seu único Controller de acordo com a URL ou algum parametro.
[/quote]

Já trabalho em alguns casos dessa maneira, e sinceramente não gosto muito.

Quando o projeto começa a crescer, você sente que tem muitos controllers e tarefa repetitiva demais.