Table Of Content© CasadoCódigo
TodososdireitosreservadoseprotegidospelaLeinº9.610,de10/02/1998.
Nenhumapartedestelivropoderáserreproduzida,nemtransmitida,semauto-
rizaçãopréviaporescritodaeditora,sejamquaisforemosmeios: fotográficos,
eletrônicos,mecânicos,gravaçãoouquaisqueroutros.
CasadoCódigo
Livrosparaoprogramador
RuaVergueiro,3185-8ºandar
04101-300–VilaMariana–SãoPaulo–SP–Brasil
CasadoCódigo Sumário
Sumário
1 AntesdefalardeCDI... 1
1.1 Boaspráticasdeorientaçãoaobjetos . . . . . . . . . . . . . . . . . . . 2
1.2 Lidandocomoacoplamento . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Evoluçãodasferramentasdegestãodedependência . . . . . . . . . . 11
1.4 Obomevelhoarquivoproperties . . . . . . . . . . . . . . . . . . . . . 11
1.5 BuscandoasdependênciascomSpringeXML . . . . . . . . . . . . . 14
1.6 BuscandoasdependênciascomSeameanotações . . . . . . . . . . . 17
1.7 Deondevimos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2 OqueéeparaqueserveaCDI 21
2.1 Paraondevamos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Evitandoqueacomplexidadedocódigosempreaumente . . . . . . . 21
2.3 Introduçãoàinjeçãodedependências . . . . . . . . . . . . . . . . . . 31
2.4 AmotivaçãodaCDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.5 Oqueéeparaqueserveumaespecificação? . . . . . . . . . . . . . . . 36
2.6 ACDIésóparaJavaEEmesmo? . . . . . . . . . . . . . . . . . . . . . 38
3 IniciandoumprojetocomCDI 39
3.1 OláCDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 OqueéumpacoteCDI? . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3 Usandoinjeçãoempropriedades,construtoresemétodosinicializa-
dores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Asformasdeseinjetardependências . . . . . . . . . . . . . . . . . . . 49
3.5 Recapitulando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
i
Sumário CasadoCódigo
4 Resolvendodependênciascomtipagemforte 53
4.1 Lidandocomaambiguidadenasdependências . . . . . . . . . . . . . 54
4.2 Osqualificadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3 Alternatives:eliminandoambiguidadeetornandoumbeanopcional 65
4.4 Prioridade:novidadedaCDI1.1,partedoJavaEE7 . . . . . . . . . . 68
4.5 Beansnomeados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.6 Trabalhandocomherançaentrebeans . . . . . . . . . . . . . . . . . . 72
4.7 Restringindootipodosbeans . . . . . . . . . . . . . . . . . . . . . . . 74
4.8 Resoluçãodedependênciasobdemandaelookupprogramático . . . 76
4.9 Resumodofuncionamentodaresoluçãodedependências . . . . . . . 80
5 OciclodevidadosobjetosgerenciadospelaCDI 83
5.1 Métodosprodutores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.2 EscoposdaCDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.3 Escopoderequisiçãocom@RequestScoped . . . . . . . . . . . . . . . 94
5.4 Escopodesessãocomo@SessionScoped. . . . . . . . . . . . . . . . . 97
5.5 @ApplicationScoped:Omaiorescopopossível . . . . . . . . . . . . . 99
5.6 @ConversationScoped:Vocêcriandoseupróprioescopo . . . . . . . 101
5.7 @Dependent:OescopopadrãodoCDI . . . . . . . . . . . . . . . . . 108
5.8 Métodosfinalizadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6 InterceptorseDecorators 113
6.1 Implementandorequisitostransversaiscominterceptors. . . . . . . . 113
6.2 Interceptadoresdeciclodevida . . . . . . . . . . . . . . . . . . . . . . 121
6.3 EstendendoumbeanexistentecomDecorators . . . . . . . . . . . . . 124
6.4 Vinculaçãodinâmicaentreoobjetodecoradoeseudecorador . . . . 126
7 DefinindoEstereótiposediminuindooacoplamentoutilizandoEventos 133
7.1 Definindoestereótipos . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.2 UtilizandoEventosparaobterumbaixíssimoacoplamento . . . . . . 137
7.3 Observadoressíncronosdeeventos . . . . . . . . . . . . . . . . . . . . 141
7.4 Eventosequalificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.5 Observadoresassíncronosdeeventos . . . . . . . . . . . . . . . . . . . 146
7.6 Injetandodependênciasnosobservadores . . . . . . . . . . . . . . . . 148
ii
CasadoCódigo Sumário
8 ArelaçãodaCDIcomasdemaisespecificaçõesJavaEE 151
8.1 RelaçãoentreCDIeEJB/JPA . . . . . . . . . . . . . . . . . . . . . . . . 152
8.2 RelaçãoentreCDIeJSF . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
8.3 RelaçãoentreCDIeJMS . . . . . . . . . . . . . . . . . . . . . . . . . . 163
8.4 Empacotandoasmelhorias . . . . . . . . . . . . . . . . . . . . . . . . . 169
9 ExtensõesCDI 171
9.1 DoSeamàCDI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
9.2 Extensõesportáveisdisponíveis . . . . . . . . . . . . . . . . . . . . . . 174
9.3 Criandonossasextensões . . . . . . . . . . . . . . . . . . . . . . . . . . 175
9.4 Extensãoportável:usandoconvençãoemvezdeconfiguração . . . . 177
9.5 Extensãonãoportável:eventosassíncronosforadoJavaEE . . . . . . 180
10 ExecutandoCDIemdiferentesambientes 189
10.1 ExecutandoCDIemservletcontainers . . . . . . . . . . . . . . . . . . 190
10.2 ExecutandoCDIapartirdeumaclassemain . . . . . . . . . . . . . . 193
10.3 EcomotestarumaaplicaçãoCDI? . . . . . . . . . . . . . . . . . . . . 195
10.4 Desenvolvendotestesdeintegraçãocompersistência. . . . . . . . . . 201
ÍndiceRemissivo 208
Versão:16.3.26
iii
Capítulo1
Antes de falar de CDI...
O assunto principal deste livro é a CDI, mas não iremos começar nossos estudos
diretamentenela. Teremmãosumaboaferramentaémuitobom,porém,antesde
utilizá-la,precisamosversobredesenvolvimentodesoftwarecomoumtodo.Mesmo
quevocêsejaumprogramadorexperiente,valeapenarevisitartópicosimportantes
comoesses.Atéporqueserexperientenãoésinônimodesabertudo.
O bom desenvolvimento de software não é uma tarefa trivial. Equilibrar a ba-
lançaquetem,deumlado,aaltacoesão,edeoutro,obaixoacoplamentoéalgoque
setornamaissimplescomaexperiênciaeobservandobonscódigos.
Nãoépossíveljustificaramáqualidadedeumsoftwarepelaquantidadedemu-
danças que o mesmo precisou sofrer por alterações no negócio, ou simplesmente
pormudançadeopiniãodocliente. Issovaiacontecer,ecabeanós,desenvolvedo-
res, projetarmosnossasaplicaçõesdeformaaacomodardamelhorformapossível
essasmudanças.
Amenosqueosoftwarequeestivermosdesenvolvendosejaalgoparaumane-
cessidade temporária, e não tenha um uso permanente, certamente ele mudará, e
1.1. Boaspráticasdeorientaçãoaobjetos CasadoCódigo
nãoapenasumavez,ecomissoalgumaspartesdeleirãosofrercomessamudança.
Podeseratéque,dependendodaurgência,aparteafetadapelamudançapreciseser
melhoradadepois,masnãopodemosdeixarqueesseefeitosejapropagadoparatoda
aaplicação.
Tomemos como exemplo uma aplicação que controle tudo relacionado aos re-
cursoshumanosdeumaempresa,desdeocadastrodetalhadodosdadosdosfuncio-
náriosatéafolhadepagamento.Agoravamosconsiderarumamudançadelegislação
quenosobrigueamudaraformacomoafolhadepagamentoécalculada,eessaseja
simplesmenteapartemaiscomplexadetodoosistema,umavezquealémdosalário
de cada funcionário, é preciso também calcular todos os impostos e descontos de
planodesaúde,empréstimoscomdescontoemfolhaetudomais.
Nesse cenário, é possível argumentar que a mudança é inviável por mexer no
cerne do sistema? Obviamente, não. Então nosso sistema precisa ser resiliente, ou
seja,suportarbemasmudanças.
No cenário apresentado, a mudança de todo o cálculo da folha de pagamento
provavelmentenãoseráapiorpartedotrabalho. Geralmenteaequipesabeprogra-
mar,escrevercódigo,econsequentementevaisaberpassarparaaIDEasalterações
nalegislação.Apiorpartecostumaseroreflexodessamudançanorestantedosoft-
ware. Apesardenãoserofocodolivro,veremosumpoucosobretestesnocapítulo
10,eentãoentenderemosoquantoessaéumaferramentaimportanteparaminimi-
zarosriscosdessescomportamentosnãoprevistosapósumaalterações. Masantes
mesmodeescrevertestesparaosistema,temosqueprojetaressesistemadeformaa
nãopropagarmosasmudançasdeumadeterminadaparteparaosistematodo.Esse
efeitocascataéquecostumaserapiorpartedeumamudançagrande.
1.1 Boas práticas de orientação a objetos
Abaixacoesãoeoaltoacoplamentosãoasprincipaiscausasdeumamudança,que
deveriaficarretidaemumaparte, sairdestruindoosistematodo. Masoquereal-
menteéisso?Ouvimostantofalaremcoesãoeacoplamentomasasvezesnãotemos
certezadoqueissosignifica.
Coesão
Acoesãoéacapacidadedeumobjetoestarfocadonasuatarefaespecífica.Seseu
papelécalcularosaláriodofuncionário,entãoquefaçaisso. Elenãodevecalcular
osalárioecalcularodescontodoimpostoderenda,ecalcularodescontodoplano
2
Description:Uma das especificações mais atuais do Java, a especificação CDI (Context and Dependency Injection) traz um enorme poder no código que o desenvolvedor escreve, possibilitando para a aplicação recursos de injeção de dependência e ciclo de vida com escopos e contextos, de forma padronizada pa