DI com Spring - projeto usando Factory para DAO's

Pessoal, como eu poderia usar o Spring de forma eficiente para a seguinte situação:

Tenho uma aplicação Web e nela meus DAOs são criados por uma classe, DAOFactory, que fica resposável por instanciar esses DAOs e atribuir à eles a Sessão corrente do Hibernate para manipulação do banco de dados.

Ao tentar usar o Spring, anotando meus DAOs com @Repository, para automatizar a criação dos objetos DAO, me deparei com o seguinte problema:

Continuarei usando a classe DAOFactory para criar meus DAOs? Há maneira de informar ao spring como construir meus DAOs?

Se a pergunta não tiver sido clara ou se for muito básica, me desculpem. :wink:

Desde já agradeço.

Sim :smiley:

Aqui tem uma arquitetura meia antiga que eu brinco de vez em quando. Uso OpenEntityManager/DI.

No web.xml: http://code.google.com/p/jsf-spring-jpa-integration/source/browse/trunk/SpringJSFBase/WebContent/WEB-INF/web.xml
meu applicationConxt separado por necessidades: http://code.google.com/p/jsf-spring-jpa-integration/source/browse/trunk/SpringJSFBase/WebContent/WEB-INF/applicationContext.xml
aqui configuração de EntityManager/TransactionManager: http://code.google.com/p/jsf-spring-jpa-integration/source/browse/trunk/SpringJSFBase/WebContent/WEB-INF/modules/database.xml

O truque : (reconhece o @PersistentContext)

e um Dao generico: http://code.google.com/p/jsf-spring-jpa-integration/source/browse/trunk/SpringJSFBase/src/br/com/covosys/dao/impl/GenericDAOImpl.java

Util que acessa fabrica do Spring: http://code.google.com/p/jsf-spring-jpa-integration/source/browse/trunk/SpringJSFBase/src/br/com/covosys/util/SpringFactory.java

[]'s

boa noite pessoal

realmente é melhor usar um factory do que instanciar seus DAOS diretamente.

Porém como vc mesmo citou com DI seu codigo nao fica acoplado nem mesmo ao factory. Os daos podem ser injetados diretamente em seu codigo cliente.

Vc precisa de um construtor ou um setter para receber a dependencia, no caso dao.

Para ser mais especifico vc as tecnologias que vc usa, configure seu applicationContext, instanciando a session factory do hibernate algo como:

<bean id="ds"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost/empresa" />
		<property name="username" value="root" />
		<property name="password" value="xxx" />
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
		destroy-method="destroy">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
		<property name="dataSource" ref="ds" />
		<property name="packagesToScan" value="br.com.empresa" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.id.new_generator_mappings">true</prop>
			</props>
		</property>

anote seus daos com @repository como vc fez amarre a dependencia:

public ClasseQueRecebeDAO() {
 @Autowired
  private InterfaceDoDAO dao;
}

vc tb deve amarrar a session ao dao, da mesma maneira: com anotacao… setter… construtor.

abrasss