37
Jasoct AS Project Lead May 4, 2011 CDI Extensions and Apache DeltaSpike Rafael Benevides Senior Software Engineer [email protected]

CDI Extensions e DeltaSpike

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: CDI Extensions e DeltaSpike

JasoctAS Project Lead

May 4, 2011

CDI Extensions andApache DeltaSpike

Rafael Benevides

Senior Software [email protected]

Page 2: CDI Extensions e DeltaSpike

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

CDI Extensions• OCP (Open closed Principle)

Page 4: CDI Extensions e DeltaSpike

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

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

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

Como registrar a extensão

Page 8: CDI Extensions e DeltaSpike

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

Opções ?

Magia ?

Como a extensão é carregada?

Page 10: CDI Extensions e DeltaSpike

Opções ?

Magia ?

ServiceLoader

Como a extensão é carregada?

Page 11: CDI Extensions e DeltaSpike

E na vida real?

Page 12: CDI Extensions e DeltaSpike

Portable Extensions

“Você decide o que fazer com os Beans que o CDI lhe fornece”

Page 13: CDI Extensions e DeltaSpike

Apache DeltaSpike

http://deltaspike.apache.org

Page 14: CDI Extensions e DeltaSpike

Como tudo começou

JBoss Seam 3 Apache MyFacesCODI

CDI Source Comunidade Java EE

Page 15: CDI Extensions e DeltaSpike

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

Então o DeltaSpike éum framework ?

Page 17: CDI Extensions e DeltaSpike

Compatibilidade

Page 18: CDI Extensions e DeltaSpike

Módulos

• “Extensões criadas pela comunidade são empacotadas como módulos”

(Documentação DeltaSpike)

Page 19: CDI Extensions e DeltaSpike

Módulos

CORE

Security

JPA

JSF

Bean validation

Servlet

Partial Bean

Data

Test Control

Scheduler

Page 20: CDI Extensions e DeltaSpike

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

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

@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

• 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

• 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

• 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

• 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

@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

• 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

• 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

• @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

• 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

• 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

• 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

• 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

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

Código Exemplo

/rafabenehttps://github.com

/demo_deltaspike

Page 37: CDI Extensions e DeltaSpike

Questions?Questions?

[email protected]@redhat.com