cdi extensions e deltaspike

Post on 29-Nov-2014

111 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

JasoctAS Project Lead

May 4, 2011

CDI Extensions andApache DeltaSpike

Rafael Benevides

Senior Software Engineerbenevides@redhat.com

Quem sou eu?

• Nome: Rafael Benevides

• JBoss Software Engineer

• JBoss Developer Materials lead

• Apache DeltaSpike committer

• Twitter: @rafabene

• e-Mail: benevides@redhat.com

CDI Extensions• OCP (Open closed Principle)

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

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

Eventos do Container CDI• BeforeBeanDiscovery

• ProcessAnnotatedType and ProcessSyntheticAnnotatedType

• AfterTypeDiscovery

• ProcessInjectionTarget and ProcessProducer

• ProcessInjectionPoint

• ProcessBeanAttributes

• ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField

• ProcessObserverMethod

• AfterBeanDiscovery

• AfterDeploymentValidation

Como registrar a extensão

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?

Opções ?

Magia ?

Como a extensão é carregada?

Opções ?

Magia ?

ServiceLoader

Como a extensão é carregada?

E na vida real?

Portable Extensions

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

Apache DeltaSpike

http://deltaspike.apache.org

Como tudo começou

JBoss Seam 3 Apache MyFacesCODI

CDI Source Comunidade Java EE

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)

Então o DeltaSpike éum framework ?

Compatibilidade

Módulos

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

(Documentação DeltaSpike)

Módulos

CORE

Security

JPA

JSF

Bean validation

Servlet

Partial Bean

Data

Test Control

Scheduler

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

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(); } }

@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

• 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

• 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

• 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

• 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

@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

• 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

• 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

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

• 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

• 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

• 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

• 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

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!

Código Exemplo

/rafabenehttps://github.com

/demo_deltaspike

Questions?Questions?

benevides@redhat.combenevides@redhat.com

top related