Injeção de Dependências: Este artigo apresenta a conceituação do padrão de design Injeção de Dependências, além de uma visão prática deste conceito utilizando a implementação de referência da JSR 299 – CDI (Context and Dependency Injection). Esta especificação tem como grande vantagem sua fácil utilização, fazendo o uso de anotações, o que nos ajuda a deixar nosso código menos verboso e abstrair o gerenciamento do controle de dependências de nossa aplicação.
Em que situação o tema é útil: Os desenvolvedores que desejam utilizar
injeção de dependências em suas aplicações terão explicações detalhadas sobre o conceito, além de uma abordagem
prática com a utilização da especificação Java EE para injeção de dependências, o CDI.
Quando programamos temos que pensar bem em nossas classes, nos papéis aos quais estas representarão em nossa aplicação. À medida que vamos criando estas classes, como por exemplo, em uma aplicação de pagamentos, criamos uma classe ProcessadorPagamentos e esta poderia ter a necessidade de uma ligação com a classe SincronizadorPagamentos. Esta ligação torna a classe ProcessadorPagamentos dependente de SincronizaPagamentos. Por ter a necessidade desta dependência, ProcessadorPagamentos deveria saber como obter uma instância de SincronizaPagamentos, para assim poder utilizá-la.
O padrão de projeto Injeção de Dependências (Dependency Injection – DI) visa manter o fraco acoplamento entre tais classes dependentes, fazendo com que ProcessadorPagamentos não precise saber como instanciar SincronizadorPagamentos. Assim, esta classe se preocupa apenas em como irá utilizar SincronizadorPagamentos, em como será o negócio associado a esta interação, cabendo ao contêiner conhecer a forma de instanciar esta dependência e disponibilizá-la no momento necessário.
As injeções de dependências são uma forma de realização do padrão de Inversão de Controle (IoC), onde neste caso, o controle de construir objetos é invertido e passa a ser uma responsabilidade do contêiner, ou de algum componente que possa assumir este controle, e não mais do implementador.
A utilização da injeção de dependências se tornou amplamente difundida, desde 2003, com a utilização corporativa do framework Spring, que se baseia nos dois padrões citados anteriormente. Atualmente o projeto Spring Framework possui outras frentes além da injeção de dependências, atuando também na parte de acesso a dados, segurança, mobile e de integração com redes sociais.
Existem também outros frameworks conhecidos no mercado de injeção de dependências, são eles PicoContainer e o Google Guice, mas até então não existia uma especificação Java que padronizasse o uso de injeção de dependências em nossas aplicações.
No entanto, em dezembro de 2009, apoiada nas especificações da JSR 330 (Injeção de Dependência para Java) e JSR 316 (Especificação dos Managed Beans), foi disponibilizada a JSR 299, a especificação Java para Contextos e Injeção de Dependências, conhecida como CDI, ou Web Beans, ficando esta especificação associada ao Java EE (Java Enterprise Edition) 6.
Os serviços fundamentais providos pelo CDI abrangem Contextos, para controle de ciclo de vida e interações dos componentes de forma bem definida, e Injeção de Dependências, para a injeção typesafe de componentes em aplicações, ou seja, livre dos erros de tipagem, incluindo a capacidade de escolher no momento da implantação, qual implementação de uma interface específica será utilizada na injeção.
Além disto, podemos destacar:
- Integração com Expression Language (EL), permitindo que qualquer bean do CDI possa ser exposto em uma página JSF ou JSP;
- Utilização de métodos Produtores (conceito criado no CDI, que será abordado logo à frente), que atuam nas injeções de maneira polimórfica em tempo de execução;
- Utilização de Alternativos, que são marcações para auxiliar o contêiner a definir qual bean injetar, atuando em tempo de implantação.
Deste modo, ao longo deste artigo veremos como diminuir o acoplamento de nossas aplicações, utilizando os conceitos de DI, aliando seus benefícios à facilidade de uso da especificação do CDI.
Um novo conceito de Beans
Ao longo do uso de tecnologias Java você já deve ter ouvido falar em Java Beans e Enterprise Java Beans (EJB). Com CDI, o conceito de um bean foi um pouco além do usado nestas tecnologias. Nele, um bean é uma fonte de objetos contextuais que definem o estado e/ou lógica de um aplicativo. Assim, um componente Java EE é um bean se o ciclo de vida de suas instâncias pode ser gerenciado pelo contêiner, de acordo com o modelo de contexto do ciclo de vida que é proposto pela especificação CDI.
Sendo assim, com pouquíssimas exceções, quase toda classe Java concreta que possui um construtor com nenhum parâmetro (ou um construtor designado com a anotação@Inject) é um bean. Isso inclui qualquer Java Bean e qualquer EJB Session Bean. A seguir temos os tipos de objetos que podem ser injetados:
- A maioria das classes Java;
- Session Beans;
- Recursos Java EE (data sources, tópicos Java Message Service, filas, fábricas de conexões);
- Contextos de Persistência (Persistence Context – objetos JPA EntityManager);
- Objetos retornados por métodos produtores, ou criados por campos produtores;
- Referências a Web Services;
- Referências remotas de Enterprise Beans.
Definindo escopos com CDI
O escopo de um bean determina além do ciclo de vida de suas instâncias, os clientes responsáveis por determinadas instâncias de um bean. Assim conseguimos obter o controle de qual cliente possui um ciclo de vida de requisição, sendo renovado a cada solicitação de requisição, ou qual possui um ciclo de vida de sessão, armazenando os dados ao longo da duração desta sessão.
De acordo com a especificação CDI, um escopo determina:
- Quando uma nova instância de qualquer bean com esse escopo é criada;
- Quando uma instância existente de qualquer bean com esse escopo é destruída;
- Quais referências injetadas referem-se a qualquer instância de um bean com esse escopo, ou seja, se temos um bean XYZ com escopo de sessão, todos os beans que são chamados no contexto da mesma sessão HTTP verão a mesma instância do bean XYZ. ...
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- 12 meses de acesso
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- Fidelidade de 12 meses
- Não compromete o limite do seu cartão
Confira outros conteúdos:
Introdução ao JDBC
Novidades do Java
Teste unitário com JUnit
Black November
Desconto exclusivo para as primeiras 200 matrículas!
Pagamento anual
12x no cartão
De: R$ 69,00
Por: R$ 54,90
Total: R$ 658,80
Garanta o desconto
Pagamento recorrente
Cobrado mensalmente no cartão
De: R$ 79,00
Por: R$ 54,90 /mês
Total: R$ 658,80
Garanta o desconto
<Perguntas frequentes>
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.