`

使用Spring的情况下如何将Dao注入DomainObject?

阅读更多
为了获得完整的RDO,将Dao注入查了一些资料,大概有三种办法:
1、手工设置,对生成的每个对象调用SetDao()。
2、使用AspectJ的AOP在编译时完成对new()的增强。
3、使用Spring的build-time weaving(同2) or load-time weaving。

第一种方法除了比较繁琐,而且会对Spring Context产生依赖。
第二种要求使用AspectJ,对于大项目使用这个东西编译比较痛苦。
第三种不知道有人用过没有?
是否还有其它方法?谢谢。
分享到:
评论
4 楼 Norther 2007-05-14  
注入都比较麻烦 现在的折衷办法就是回归原始 在DomainObject种放弃IOC 采用主动通过context查找
3 楼 pig345 2007-05-14  
最近也在看这个问题,spring确实 和 DomainObject的设计有些矛盾,好像是Spring的软肋,其实跟他的实现有关系(基于反射,而不是AspectJ),因此不能对new的对象进行干预。

前些天花了点时间,考律用AspectJ来搞定。
public aspect DomainSupportAspect issingleton() {

	private interface HasEntityManager {

		public EntityManager getEntityManager();

	}

	public EntityManager HasEntityManager.getEntityManager() {
		return EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
	}

	declare parents:(server.domain..*) implements HasEntityManager;

	@PersistenceUnit
	private static EntityManagerFactory emf;
}

当然代码是直接使用JPA的。
注意,DomainObject需要放到Spring事物里面执行
public class TestService {

	public void printEntityManager(String threadName) {
		...
	}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
   <!-- EntityManagerFactory -->
	<bean id="entityManagerFactory"	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitManager">
			<bean class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
				<property name="persistenceXmlLocations">
					<list>
						<value>classpath:jpa-persistence.xml</value>
					</list>
				</property>
			</bean>
		</property> 
		<property name="persistenceUnitName" value="thelog_db_jpa" />
	</bean>
	<!-- JPA Annotations support -->
	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
	<!-- JPA Transaction -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	   <property name="entityManagerFactory" ref="entityManagerFactory"/>
	</bean>
	<tx:advice id="allMethodTransactionAdvice" transaction-manager="transactionManager">
	   <tx:attributes>
	      <tx:method name="*"/>
	   </tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="serviceMethods" expression="execution(public * net.common.thelog.server.service..*.*(..))"/>
		<aop:advisor pointcut-ref="serviceMethods" advice-ref="allMethodTransactionAdvice"/>
	</aop:config>
	<bean id="testService" class="net.common.thelog.server.service.TestService"/>
	<bean class="net.common.thelog.server.support.DomainSupportAspect" factory-method="aspectOf" />
</beans>

不过具体的事物/EntityManager部分,是否是隔离的还没有测试,目前还在探索中。
2 楼 CurrentJ 2007-04-09  
准备采用如下方式:
1、将DO放入Spring容器,利用Spring Ioc将DAO注入。
2、建立工厂接口,实现一个依赖Spring的工厂类。
3、所有创建DO的地方使用该工厂。
4、放弃ORM,适用Spring Jdbc。
1 楼 drliujia 2007-04-06  
可以考虑static dao,一次性注入

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring chm文档

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    最新Java面试宝典pdf版

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    Java面试笔试资料大全

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    火炬博客系统7

    即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter...

    火炬博客系统5

    即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter...

    火炬博客系统6

    即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter...

    Java面试宝典2010版

    创建了几个String Object? 二者之间有什么区别? 34、String 和StringBuffer的区别 35、如何把一段逗号分割的字符串转换成一个数组? 36、数组有没有length()这个方法? String有没有length()这个方法? 37、下面...

    Java面试宝典-经典

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    java面试题大全(2012版)

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    Java面试宝典2012版

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? ...

    java面试宝典2012

    创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? String有没有length()这个方法? 26 ...

    JAVA面试宝典2010

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    Java面试宝典2012新版

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

Global site tag (gtag.js) - Google Analytics