Download - CDI Extensions e DeltaSpike
![Page 1: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/1.jpg)
JasoctAS Project Lead
May 4, 2011
CDI Extensions andApache DeltaSpike
Rafael Benevides
Senior Software [email protected]
![Page 2: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/2.jpg)
Quem sou eu?
• Nome: Rafael Benevides
• JBoss Software Engineer
• JBoss Developer Materials lead
• Apache DeltaSpike committer
• Twitter: @rafabene
• e-Mail: [email protected]
![Page 3: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/3.jpg)
CDI Extensions• OCP (Open closed Principle)
![Page 4: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/4.jpg)
OCP in CDI = Portable Extensions
• Baseado em SPI (Service Provider Interface)
• Permite: ✔ Registrar novos “Beans”
✔ Registrar novos “Scopes” (custom scopes)
✔ Satisfazer @Inject “tion” points
✔ Modificar os metadados dos Beans
![Page 5: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/5.jpg)
Como criar uma CDI Portable Extension ?
• Baseado no java.util.ServiceLoader
• Implementar javax.enterprise.inject.spi.Extension
• Registrar a Extensão
• Observar eventos do Container CDI
• Durante o boot do container, modificar o comportamento do CDI
![Page 6: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/6.jpg)
Eventos do Container CDI• BeforeBeanDiscovery
• ProcessAnnotatedType and ProcessSyntheticAnnotatedType
• AfterTypeDiscovery
• ProcessInjectionTarget and ProcessProducer
• ProcessInjectionPoint
• ProcessBeanAttributes
• ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField
• ProcessObserverMethod
• AfterBeanDiscovery
• AfterDeploymentValidation
![Page 7: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/7.jpg)
Como registrar a extensão
![Page 8: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/8.jpg)
Como a extensão é carregada?
Opções ?
O container CDI procura todas implementações da interface Extension ?
A JRE procurar todas implemetações da interface Extension?
![Page 9: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/9.jpg)
Opções ?
Magia ?
Como a extensão é carregada?
![Page 10: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/10.jpg)
Opções ?
Magia ?
ServiceLoader
Como a extensão é carregada?
![Page 11: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/11.jpg)
E na vida real?
![Page 12: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/12.jpg)
Portable Extensions
“Você decide o que fazer com os Beans que o CDI lhe fornece”
![Page 13: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/13.jpg)
Apache DeltaSpike
http://deltaspike.apache.org
![Page 14: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/14.jpg)
Como tudo começou
JBoss Seam 3 Apache MyFacesCODI
CDI Source Comunidade Java EE
![Page 15: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/15.jpg)
Qual o propósito do projeto DeltaSpike ?
“Suportar o desenvolvimento de Portable Extensions CDI que promovam funcionalidades úteis para aplicações Java que não são fornecidas pela especificação CDI.”
(Documentação DeltaSpike)
![Page 16: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/16.jpg)
Então o DeltaSpike éum framework ?
![Page 17: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/17.jpg)
Compatibilidade
![Page 18: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/18.jpg)
Módulos
• “Extensões criadas pela comunidade são empacotadas como módulos”
(Documentação DeltaSpike)
![Page 19: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/19.jpg)
Módulos
CORE
Security
JPA
JSF
Bean validation
Servlet
Partial Bean
Data
Test Control
Scheduler
![Page 20: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/20.jpg)
Strong typing• Injeção de dependência tipada
• Elimina a dependência de Strings
• Fácil refatoração
• Compilador pode detectar erros
• Nenhuma ferramenta especial é
necessária
• Elimina cast (ok, esconde casts)
• Resolução de erros detectado durante deploy
• Strong typing == Strong tooling
![Page 21: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/21.jpg)
Principais funcionalidades• Exception Handler
try { // Invoca um serviço que lança exception } catch (NoResultException e) { // O tratamento de exception é delegado para os @ExceptionHandlers catchEvent.fire(new ExceptionToCatchEvent(e)); }
• Handlers
@ExceptionHandler public class MyHandler { void fazAlgoComException(@Handles ExceptionEvent<Throwable> evt) { // Faz Algo com a Exception evt.handledAndContinue(); } }
![Page 22: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/22.jpg)
@Injectprivate ProjectStage projectStage;
boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage);
<h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}"
-Dorg.apache.deltaspike.ProjectStage=Development
Principais funcionalidadesType-safe Project Stage
•UnitTest, •Development•SystemTest•IntegrationTest•Staging•Production
Confgurável via DeltaSpike Confguration API
![Page 23: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/23.jpg)
• DeltaSpike Configuration API public String getFilaJMS() { return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue"); } jms.queue.Production=queue/queueProduction jms.queue.Development=queue/queueDevelopment
• Múltiplos ConfigSources:
• Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename is "META-INF/apache-deltaspike.properties")
• JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/")
• Environment properties (deltaspike_ordinal = 300)
• System properties (deltaspike_ordinal = 400)
Principais funcionalidades
![Page 24: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/24.jpg)
• Injetable Resource
@Inject@InjectableResource(location = "/version.txt")private InputStream is;
public String getVersion() throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { return br.readLine(); } }
Principais funcionalidades
![Page 25: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/25.jpg)
• I18n Messages@Named("msg")@MessageBundlepublic interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha();}
<br /> #{msg.senha()}:
@Injectprivate Messages messages;
new FacesMessage(msg.usuarioAdicionado("Rafael"));
Principais funcionalidades
![Page 26: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/26.jpg)
• Segurança@Retention(value = RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@SecurityBindingTypepublic @interface AdminOnly {
}
@ApplicationScopedpublic class ApplicationAuthorizer{ @Secures @AdminOnly public boolean verificaPermissao(InvocationContext invocationContext,
BeanManager manager, @Logado Usuario usuario) throws Exception { return usuario.getRole().equalsIgnoreCase("Admin"); }}
@AdminOnly public void iniciarTarefaAdministrativa() { // Inicia uma tarefa }
Principais funcionalidades
![Page 27: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/27.jpg)
@Repositorypublic interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O DeltaSpike cria um proxy com implementações para● count();● findAll();● findBy(PK);● flush();● refresh();● remove();● save();● saveAndFlush(); }
Principais funcionalidades• Data Module – Repository Pattern
![Page 28: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/28.jpg)
• Data Module – Repository Pattern@Repositorypublic interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); }
@Repositorypublic interface RepositorioPostagens extends EntityRepository<Postagem, Long> { @Query("SELECT p FROM Postagem AS p WHERE p.autor in (?1)") public List<Postagem> findBySeguidos(List<Usuario> usuariosSeguidos);
}
Principais funcionalidades
![Page 29: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/29.jpg)
• Type-safe view-config for JSF
// type-safe outcomepublic Class<Welcome> telaHome() { return Home.class;}
@Inject ViewNavigationHandler vnh;
// type-safe outcomepublic Class<CriarUsuario> tela2() { vnh.navigateTo(CriarUsuario.class);}
@Secured(CustomAccessDecisionVoter.class)public interface SecuredPages {}
@View(navigation = REDIRECT)public interface Pages extends ViewConfig{ class Index implements Pages { }
interface Admin extends Pages, SecuredPages { class Index implements Admin { }
@View(navigation = FORWARD) class Home implements Admin { } }}
Principais funcionalidades
![Page 30: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/30.jpg)
• @WindowScoped
“É como se fosse uma sessão por aba/janela...
Não existem muitos casos de uso que precisam compartilhar dados entre as abas.”
(Documentação DeltaSpike)
Principais funcionalidades
![Page 31: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/31.jpg)
• Agendador de Jobs integrado com o Quartz
//Job de exemplo agendado para rodar a cada 1 minuto@Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false)public class CdiAwareQuartzJob implements org.quartz.Job {
// O Job permite injeção CDI @Inject private AdminServices service;
@Override public void execute(JobExecutionContext context) throws JobExecutionException { service.executarRotinasAdministrativas();
}} @Inject
private Scheduler<Job> jobScheduler;
public void iniciarTarefaAdministrativa() { jobScheduler.registerNewJob(CdiAwareQuartzJob.class);}
Principais funcionalidades
![Page 32: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/32.jpg)
• Servlet Module – Injectable Servlet objects/ Servlet Events Propagation
• @Inject @DeltaSpike (qualifier para compatibilidade com CDI 1.1)• private HttpServletRequest request;• private HttpServletResponse response;• private HttpSession session;• private Principal principal;
• @Observes @Initialized HttpServletRequest• @Observes @Destroyed HttpServletRequest• @Observes @Initialized HttpSession
Outras funcionalidades
![Page 33: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/33.jpg)
• Bean Validation Module
• Permite que “Validators” recebam injeção de objetos via CDI em ambiente java EE 6 / CDI 1.0
• Partial Bean
• Permite a criação de implementações para suas interfaces ou classes abstratas
Outras funcionalidades
![Page 34: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/34.jpg)
• Container Control• Permite fazer o boot de implementações
CDI em ambiente Java SE, bem como controlar o ciclo de vida dos contextos
• Test Control• Facilita a criação de testes CDI• Inicia e finalizar o container CDI / Inicia
Contextos• Controla o ProjectStage
Outras funcionalidades
![Page 35: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/35.jpg)
Conclusão• O DeltaSpike não é um full-stack framework
• O DeltaSpike é um conjunto de Portable Extensions para facilitar o desenvolvimento Javaa utilizando CDI
• O DeltaSpike é um conjunto de ferramentas!
![Page 36: CDI Extensions e DeltaSpike](https://reader031.vdocuments.net/reader031/viewer/2022020217/547e8b0ab379593f2b8b551f/html5/thumbnails/36.jpg)
Código Exemplo
/rafabenehttps://github.com
/demo_deltaspike