inicializacao.xml
5.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []>
<chapter id="inicializacao">
<title>Inicializadores</title>
<para>
Neste capítulo serão considerados os seguintes assuntos:
<itemizedlist>
<listitem>motivação para o uso de um mecanismo padronizado para <emphasis>inicialização do ambiente</emphasis>;</listitem>
<listitem>funcionamento e uso das anotações <literal>@Startup</literal> e <literal>@Shutdown</literal>.</listitem>
</itemizedlist>
</para>
<section>
<title>Introdução ao mecanismo</title>
<para>
Uma aplicação qualquer, seja do tipo Web ou desktop, geralmente necessita efetuar determinadas tarefas durante a sua
inicialização e ou finalização. Eis alguns exemplos: abertura de conexão a um servidor de banco de dados, carregamento de
parâmetros de configuração a partir de arquivos externos e execução de scripts específicos. Ou seja, normalmente essas ações
são definidas como funções estruturais da aplicação.
</para>
<para>
Para que a execução dessas ações ocorra de forma concisa, faz-se necessário o uso de um mecanismo padronizado para inicialização
do ambiente. O <emphasis>Demoiselle Framework</emphasis> fornece esse mecanismo através da especificação
<emphasis>CDI (Common Dependency Injection)</emphasis> introduzindo duas anotações:
<literal>@Startup</literal> e <literal>@Shutdown</literal>.
</para>
<para>
Veremos na seção seguinte como implementar a inicialização em uma aplicação Java.
</para>
</section>
<section>
<title>Implementação na aplicação</title>
<para>
A fim de utilizar o mecanismo inerente do <emphasis>Demoiselle Framework</emphasis>, é preciso simplesmente anotar os métodos
contendo as instruções desejadas com <literal>@Startup</literal>, para a <emphasis>inicialização</emphasis>, ou
<literal>@Shutdown</literal>, para a <emphasis>finalização</emphasis>.
</para>
<tip>
<para>
O mecanismo de inicialização do <emphasis>Demoiselle Framework</emphasis> é independente da natureza da aplicação Java, isto é,
visa tanto aplicações do tipo Web quanto do tipo desktop (ex: Swing).
</para>
</tip>
<para>
As instruções contidas em um método anotado com <literal>@Startup</literal> serão executadas automaticamente quando a aplicação
Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método <literal>main()</literal>.
Nenhum outro arquivo ou classe precisa ser definido. A anotação <literal>@Startup</literal> permite a indicação do argumento
<literal>priority</literal>, um número inteiro que serve para definir a prioridade de execução do respectivo método na existência
de mais de um inicializador para a aplicação.
</para>
<para>
De maneira análoga, um método anotado com <literal>@Shutdown</literal> será executado no momento de finalização de uma aplicação,
obedecendo também à ordem de prioridade definida com o argumento <literal>priority</literal>.
</para>
<para>
Eis um exemplo de implementação de inicializador em uma aplicação:
</para>
<programlisting role="JAVA"><![CDATA[public class EscolaInitializer {
@Startup(priority = 1)
public void initialize() {
...
}
@Shutdown(priority = 5)
public void finalize() {
...
}
}]]></programlisting>
<tip>
<para>
Para a definição de prioridade de execução de um método na inicialização ou finalização, podem ser utilizadas as
constantes <literal>MIN_PRIORITY</literal> ou <literal>MAX_PRIORITY</literal> presentes em
<literal>br.gov.frameworkdemoiselle.annotation.Startup</literal>.
</para>
</tip>
</section>
<section>
<title>Um exemplo prático</title>
<para>
Eis um interessante caso de uso de inicialização e finalização: rodar um servidor de modo standalone em paralelo à
execução da aplicação principal. Eis o código referente à essa implementação:
</para>
<programlisting role="JAVA"><![CDATA[import br.gov.frameworkdemoiselle.annotation.Shutdown;
import br.gov.frameworkdemoiselle.annotation.Startup;
import static br.gov.frameworkdemoiselle.annotation.Startup.MAX_PRIORITY;
import static br.gov.frameworkdemoiselle.annotation.Startup.MIN_PRIORITY;
public class DatabaseServer {
private final org.hsqldb.Server server;
public DatabaseServer() {
server = new Server();
server.setDatabaseName(0, "db");
server.setDatabasePath(0, "database/db");
server.setPort(9001);
server.setSilent(true);
}
@Startup(priority = MAX_PRIORITY)
public void startup() {
server.start();
}
@Shutdown(priority = MIN_PRIORITY)
public void shutdown() {
server.stop();
}
}]]></programlisting>
</section>
<!--
vim:et:ts=3:sw=3:tw=120
-->
</chapter>