Para este post é necessário que você leia antes este outro post: LINK
Abaixo é mostrado o mesmo processo de configuração do CORE demonstrado no post citado acima, só que usando o XML.
<config-property name="exemplo" value="com.aplicacao.Exemplo">
<property value="valor da propriedade1" constructor-arg="true" />
<property constructor-arg="true">
<list>
exemplo list string 1;
exemplo list string 2;
exemplo list string 3;
exemplo list string N;
</list>
</property>
<property name="propriedade3">
<array>
exemplo list string 1;
exemplo list string 2;
exemplo list string 3;
exemplo list string N;
</array>
</property>
</config-property>
Para este exemplo vamos considerar que o XML acima esteja no pacote org.lindbergframework.configuracao e que o nome do XML é o padrão, lindberg-config.xml, seguindo o mesmo nome do schema.
XmlCoreConfiguration coreConfiguration = new ClassPathXmlCoreConfiguration("org/lindbergframework/configuracao/lindberg-config.xml");
coreConfiguration.initializeContext();
Observe que agora inicializamos o contexto de forma diferente do exemplo anterior.
Os dois exemplos, tanto o deste post quanto o do post citado resultarão na seguinte saída no console informando o status da inicialização da configuração do framework:
INFO: Initializing Lindberg Core Context
INFO: Lindberg Core Context initialized
Neste exemplo observe que foi utilizada a classe ClassPathXmlCoreConfiguration para criar a configuração. Essa classe é uma extensão natural de XmlCoreConfiguration para trabalhar com um arquivo de configuração que está dentro do classpath do projeto. Os dois exemplos mostrados ao final configuram o framework respectivamente a partir de:
- CoreContext.getInstance().initialize(coreConfiguration);
- coreConfiguration.initializeContext();
A partir daí o core do framework está configurado e podemos por exemplo obter uma instância de um bean a partir da fábrica. Supondo que no pacote org.lindbergframework.exemplo.beans tenha um bean cujo ID seja “pessoaDAO” então podemos obter uma instância desse bean chamando a BeanFactory como demonstrado a seguir, isso só pode ser feito após claro a devida configuração do CORE.
IPessoaDAO pessoaDAO = CoreContext.getInstance().getBeanFactory().getBean("pessoaDAO");
Uma outra forma de fazer a mesma coisa e obter o mesmo bean seria:
IPessoaDAO pessoaDAO = UserBeanContext.getInstance().getBean("pessoaDAO");
Todo o funcionamento do mecanismo de injeção de dependência será detalhado mais a frente. Aqui foi demonstrado apenas como exemplo do uso da configuração na prática.
– Uso do carácter '#' no XML para definir propriedades e métodos getters estáticos
Imagine que você quer por algum motivo que o framework chame um método 'get' seu para obter a instância da implementação de BeanFactory a ser usada, imagine que você queira isso pois por algum motivo você precise fazer algum processamento nesse método 'get' para efetuar alguma customização, registro de log, enfim. Ou imagine ainda que por algum motivo você quer que a String com pacote base (onde o framework encontrará os beans que farão parte do contexto de 'inversão de controle' de modo que a criação, injeção de dependência desses seja responsabilidade do framework) esteja em numa constante em uma de suas classes de modo que você possa usá-la em outros lugares no seu projeto centralizando esse atributo na forma de uma constante.
Para estes casos o framework provê o recurso de usar o carácter coringa '#'. O uso desse carácter antes da definição de um valor de uma propriedade no arquivo XML de configuração informa que o valor real daquela propriedade será obtido através da chamada ao método 'get' estático e público ou da constante também estática e pública definidos na String ao qual o carácter '#' é fixado.
Isso só é possível para propriedades e métodos que são estáticos e públicos e nos casos do método que seja um método seguindo o padrão de nomenclatura de métodos getter, não sendo para este último caso necessário preceder o nome do método no XML com 'get' pois o framework já busca o método adequado baseado no padrão de nomenclatura.
Por exemplo, se quiséssemos que as duas propriedades mostradas anteriormente para o CORE fossem obtidas agora da seguinte forma:
- di-basepackage: A partir de uma constante estática e pública chamada BASEPACKAGE na classe com.soft.MyConstants;
- BeanFactory: A partir de um método getter público e estático chamado getMyBeanFactory na classe com.soft.MyFactoryConfiguration.
Então a nova configuração seria:
<core>
<config-property name="lindberg.core.di-basepackage"
value="#com.soft.MyConstants.BASEPACKAGE"/>
<config-property name="lindberg.core.beanfactory" value="#com.soft.MyFactoryConfiguration.myBeanFactory"/>
</core>
Observe que agora os valores das propriedades estão precedidos do carácter '#'. Observe que o valor da propriedade beanFactory, que aponta para um método 'get', não contém o prefixo 'get' ou seja o nome completo do método 'getMyBeanFactory' e sim apenas 'myBeanFactory'. Isso pode ser feito pois o framework por padrão vai buscar o método 'get', seguindo os padões de nomenclatura, fazendo 'get' + 'MyBeanFactory' e invoca o método 'getMyBeanFactory'. Da mesma forma caso deseje informar diretamente o nome do método o framework percebe e o invoca da mesma forma. Seguindo este pensamento a definição da propriedade beanFactory poderia ser feita sem nenhuma mudança no processamento da seguinte forma:
<config-property name="lindberg.core.beanfactory"value="#com.soft.MyFactoryConfiguration.getMyBeanFactory"/>
Agora informamos diretamente o nome completo do método getMyBeanFactory. O framework vai detectar que isso foi feito e não fará nenhuma conversão de nomenclatura, invocando diretamente o método informando.
NOTA: Apenas métodos e propriedades públicos e estáticos podem ser usados com '#'.
Nenhum comentário:
Postar um comentário