Spring - Obtenção de instâncias

3 respostas
Tchello

Boa tarde pessoal.

Nunca tinha mexido com Spring antes, portanto penei um pouco pra conseguir fazer as configurações necessárias.

Enfim, preciso fazer algumas coisas com spring - hibernate e para isso foi criado uma interface CountryDAO e uma implementação CountryHibernateDAO que também herda HibernateDaoSupport.

Preciso usar esse DAO em uma classe que não é gerenciada pelo spring mas quero que o dao o seja.

Para tanto fiz a configuração necessária do sessionFactory, datasource, etc no applicationContext inclusive a seguinte para que ele encontre a implementação do DAO:

<bean id="countryDAO" class="com.something.domain.dao.country.CountryHibernateDAO"
		autowire="byName">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>

Bom, na minha classe normal que não é geranciada pelo spring como faço pra obter uma instância desse DAO?

Alguém tem alguma luz? To tentando de tudo e não acho nada no google, aliás, acho coisa pra k* mas é muita informação desencontrada etc e tal…

Só preciso saber disso por enquanto.

Obrigado!

3 Respostas

peerless

Esta aplicação é WEB? Se sim, está usando algum framework? Normalmente o Spring possui integração com vários frameworks WEB - ie. carregam o contexto do Spring na inicialização da aplicação (tecnicamente falando, ele faz as injeções na hora que o framework instancia os controllers).

Caso não, tu precisa antes de mais nada definir o endpoint das suas injeções, ou seja.. a ultima camada que receberá injeção. Em sistemas multi-layers, a ultima camada normalmente é o controller. Algo como:

class Controller {

  private Service service;

}

class Service {
  private Dao dao;
}

neste caso, tu pode ter algo proximo a isso no Spring:

<bean id="dao" class="br.com.sistema.MeuDao"/>

<bean id="service" class="br.com.sistema.MeuService">
<property name="dao" ref="dao" />
</bean>

Isso significa que, ao recuperar uma instancia do Service, o dao será injetado automaticamente no mesmo.

Eu uso esta classe aqui para instanciar o container, digamos, stand-alone.

Com isso, lá no controller tu podes fazer:

private Service service = SpringContainer.getInstancia().getBean("service");

E lembre-se, isso (IoC/DI) tem mais sentido se trabalhar pensando em interfaces.

abraço.

Tchello

Sim, no caso estou rodando no JBoss 4.2.3.
Versão do Spring é a 2.5.

Bom, o que você disse eu meio que já sabia, mas não responde bem minha pergunta.

É exatamente isso que quero saber, COMO recuperar uma instância do service/dao?

Depois de ter feito esse post consegui fazer usando uma estratégia como essa:

contextoSpring = new ClassPathXmlApplicationContext("applicationContext.xml");

Mas fui alertado que essa não seria uma prática muito recomendada, já que pode haver alguns problemas de memory leak, etc e tal…

Ainda mais se você considerar que já configurei o meu applicationContext.xml no classpath no web.xml

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/applicationContext.xml
		</param-value>
	</context-param>

Considerando isso é bastante burocrático e redundante recuperar o ApplicationContext programaticamente, não?

Não existe uma forma mais elegante?!

Estranho o pessoal do spring falar tão mal de EJB que depois da versão 3.0 é MUITO mais simples e fácil =Z

peerless

Tchello:
Sim, no caso estou rodando no JBoss 4.2.3.
Versão do Spring é a 2.5.

Bom, o que você disse eu meio que já sabia, mas não responde bem minha pergunta.

É exatamente isso que quero saber, COMO recuperar uma instância do service/dao?

Depois de ter feito esse post consegui fazer usando uma estratégia como essa:

contextoSpring = new ClassPathXmlApplicationContext("applicationContext.xml");

Mas fui alertado que essa não seria uma prática muito recomendada, já que pode haver alguns problemas de memory leak, etc e tal…

Ainda mais se você considerar que já configurei o meu applicationContext.xml no classpath no web.xml

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/applicationContext.xml
		</param-value>
	</context-param>

Considerando isso é bastante burocrático e redundante recuperar o ApplicationContext programaticamente, não?

Não existe uma forma mais elegante?!

Estranho o pessoal do spring falar tão mal de EJB que depois da versão 3.0 é MUITO mais simples e fácil =Z

Então, vamos alinhar algumas coisas. O Seu application container é o JBoss, mas qual framework MVC tu está usando? Ou está fazendo direto com Servlets?

Sim, se for uma aplicação WEB sempre será mais elegante pegar implicitamente via listener (aqui um exemplo) - agora, que gera memory leak eu nunca vi… tem a fonte?

E o pessoal do Spring, reclamava do EJB em suas versões antigas. O novo EJB foi baseado nas idéias do Spring.

Criado 14 de setembro de 2011
Ultima resposta 14 de set. de 2011
Respostas 3
Participantes 2