Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CDI Extensions e DeltaSpike

1,055 views

Published on

General prez about CDI Portable extensions and the Apache DeltaSpike project.

Published in: Technology
  • Be the first to comment

CDI Extensions e DeltaSpike

  1. 1. CDI Extensions and Apache DeltaSpike Jasoct AS Project Lead Rafael May 4, Benevides 2011 Senior Software Engineer benevides@redhat.com
  2. 2. Quem sou eu? • Nome: Rafael Benevides • JBoss Software Engineer • JBoss Developer Materials lead • Apache DeltaSpike committer • Twitter: @rafabene • e-Mail: benevides@redhat.com
  3. 3. CDI Extensions • OCP (Open closed Principle)
  4. 4. 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
  5. 5. 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
  6. 6. Eventos do Container CDI • BeforeBeanDiscovery • ProcessAnnotatedType and ProcessSyntheticAnnotatedType • AfterTypeDiscovery • ProcessInjectionTarget and ProcessProducer • ProcessInjectionPoint • ProcessBeanAttributes • ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField • ProcessObserverMethod • AfterBeanDiscovery • AfterDeploymentValidation
  7. 7. Como registrar a extensão
  8. 8. 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?
  9. 9. Opções ? Como a extensão é Magia ? carregada?
  10. 10. Opções ? Como a extensão é Magia ? ServiceLoader carregada?
  11. 11. E na vida real?
  12. 12. Portable Extensions “Você decide o que fazer com os Beans que o CDI lhe fornece”
  13. 13. Apache DeltaSpike http://deltaspike.apache.org
  14. 14. Como tudo começou JBoss Seam 3 Apache MyFaces CODI CDI Source Comunidade Java EE
  15. 15. 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)
  16. 16. Então o DeltaSpike é um framework ?
  17. 17. Compatibilidade
  18. 18. Módulos • “Extensões criadas pela comunidade são empacotadas como módulos” (Documentação DeltaSpike)
  19. 19. Módulos CORE Security JPA JSF Bean validation Servlet Partial Bean Data Test Control Scheduler
  20. 20. 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
  21. 21. 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(); } }
  22. 22. Principais funcionalidades Type-safe Project Stage @Inject private ProjectStage projectStage; boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage); <h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}" •UnitTest, •Development •SystemTest •IntegrationTest •Staging •Production Confgurável via DeltaSpike Confguration API -Dorg.apache.deltaspike.ProjectStage=Development
  23. 23. Principais funcionalidades • 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)
  24. 24. Principais funcionalidades • 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(); } }
  25. 25. Principais funcionalidades • I18n Messages @Named("msg") @MessageBundle public interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha(); } <br /> #{msg.senha()}: @Inject private Messages messages; new FacesMessage(msg.usuarioAdicionado("Rafael"));
  26. 26. Principais funcionalidades • Segurança @Retention(value = RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) @Documented @SecurityBindingType public @interface AdminOnly { } @ApplicationScoped public 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 }
  27. 27. Principais funcionalidades • Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O DeltaSpike cria um proxy com implementações para ● count(); ● findAll(); ● findBy(PK); ● flush(); ● refresh(); ● remove(); ● save(); ● saveAndFlush(); }
  28. 28. Principais funcionalidades • Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); } @Repository public 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); }
  29. 29. Principais funcionalidades • Type-safe view-config for JSF // type-safe outcome public Class<Welcome> telaHome() { return Home.class; } @Inject ViewNavigationHandler vnh; // type-safe outcome public 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 { } } }
  30. 30. Principais funcionalidades • @WindowScoped “É como se fosse uma sessão por aba/janela... Não existem muitos casos de uso que precisam compartilhar dados entre as abas.”
  31. 31. Principais funcionalidades • 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); }
  32. 32. Outras funcionalidades • 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
  33. 33. Outras funcionalidades • 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
  34. 34. Outras funcionalidades • 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
  35. 35. 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!
  36. 36. Código Exemplo /rafabene https://github.com /demo_deltaspike
  37. 37. QQuueessttiioonnss?? bbeenneevviiddeess@@rreeddhhaatt..ccoomm

×