Durante muito tempo, acreditei que havia um valor em ter uma "configuração centralizada e declarativa", como os arquivos xml que todos costumávamos usar. Então percebi que a maioria das coisas nos arquivos não era de configuração - nunca foi alterada em lugar algum após o desenvolvimento. Então percebi que "centralizado" só tem valor em sistemas muito pequenos - somente em sistemas pequenos você poderá criar um arquivo de configuração como um todo . E qual é realmente o valor de entender a fiação como um todo, quando as mesmas "ligações" são duplicadas principalmente por dependências no código? Portanto, a única coisa que guardei são os metadados (anotações), que ainda são meio declarativos. Eles nunca mudam em tempo de execução e nunca dados de "configuração" que alguém alterará em tempo real - então eu acho que mantê-lo no código é bom.
Uso a fiação automática completa o máximo possível. Eu amo isso. Não voltarei à primavera à moda antiga, a menos que seja ameaçado à mão armada. Minhas razões para preferir totalmente @Autowired
mudaram ao longo do tempo.
No momento, acho que o motivo mais importante para usar a fiação automática é que há menos uma abstração em seu sistema para acompanhar. O "nome do bean" desapareceu efetivamente. Acontece que o nome do bean só existe por causa do xml. Portanto, uma camada completa de indireções abstratas (onde você colocaria o nome do feijão "foo" na barra de feijão)) desapareceu. Agora, conecto a interface "Foo" diretamente ao meu bean e a implementação é escolhida pelo perfil de tempo de execução. Isso me permite trabalhar com código ao rastrear dependências e implementações. Quando vejo uma dependência com conexão automática no meu código, basta pressionar a tecla "ir para implementação" no meu IDE e a lista de implementações conhecidas é exibida. Na maioria dos casos, há apenas uma implementação e eu vou direto para a classe. Lata' que implementação está sendo usada (afirmo que o oposto está mais próximo da verdade com a fiação xml - engraçado como sua perspectiva muda!)
Agora você pode dizer que é apenas uma camada muito simples, mas cada camada de abstração que adicionamos aos nossos sistemas aumenta a complexidade. Eu realmente não acho que o xml tenha agregado algum valor real a qualquer sistema com o qual trabalhei.
A maioria dos sistemas com os quais trabalho já tem apenas uma configuração do ambiente de tempo de execução da produção. Pode haver outras configurações para teste e assim por diante.
Eu diria que a fiação automática completa é o rubi nos trilhos da primavera: ela abraça a noção de que há um padrão de uso normal e comum que a maioria dos casos de uso segue. Com a configuração XML, você permite muito uso de configuração consistente / inconsistente que pode / não ser pretendido. Eu já vi tantas configurações xml exageradas com inconsistências - elas são refatoradas junto com o código? Pensei que não. Essas variações existem por um motivo? Geralmente não.
Mal usamos qualificadores em nossa configuração e encontramos outras maneiras de resolver essas situações. Essa é uma clara "desvantagem" que encontramos: mudamos um pouco a maneira como codificamos para torná-la mais suave com a fiação automática: um repositório de clientes não implementa mais a Repository<Customer>
interface genérica , mas fazemos uma interface CustomerRepository
que se estende Repository<Customer>
. Às vezes, há também um truque ou dois no que diz respeito à subclassificação. Mas geralmente apenas nos aponta na direção de uma digitação mais forte, o que acho quase sempre uma solução melhor.
Mas sim, você está vinculando-se a um estilo particular de DI, principalmente a primavera. Nós nem sequer criamos setters públicos para dependências (para que você possa argumentar que estamos com +1 no departamento de encapsulamento / ocultação de informações) Ainda temos alguns xml em nosso sistema, mas o xml basicamente contém apenas as anomalias. A instalação automática completa integra-se perfeitamente ao xml.
A única coisa de que precisamos agora é que o @Component
, @Autowired
e o restante, seja incluído em um JSR (como o JSR-250 ), para que não tenhamos que amarrar a mola. É assim que as coisas acontecem no passado (as coisas vêm java.util.concurrent
à mente), então eu não ficaria totalmente surpreso se isso acontecesse novamente.