
您应该看看Spring Roo。它们具有类似的东西(没有DAO或服务),但是EntityManager并不是静态的。
他们通过
@Configurable在实体中添加注释来达到目的:
@Entiy@Configurableclass MyEntity() { @PersistenceContext transient EntityManager Car.entityManager; ... public static MyEntity findMyEntityById(Long id) { if (id == null) return null; return entityManager().find(MyEntity.class, id); } public static EntityManager entityManager() { EntityManager em = new MyEntity().entityManager; if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)"); return em; } }无论如何,它有两个或三个缺点:
- 您需要AspectJ
- 这条线
EntityManager em = new MyEntity().entityManager;
很丑 - 如果要模拟持久性“层”,则测试将变得有些困难。但是幸运的是,Spring提供了一个特殊的AOP拦截器(@见org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMockingControl的JavaDoc)
但这也有一些不错的效果:例如persist和delete方法变得非常自然,它们只是实体的成员:
@Transactionalpublic void persist() { if (this.entityManager == null) this.entityManager = entityManager(); this.entityManager.persist(this);}为了使none Roo项目可行,
@Configurable您需要至少这样做:
扩展pom.xml:
<properties> <spring.version>3.0.5.RELEASE</spring.version> <aspectj.version>1.6.11</aspectj.version> <aspectj-maven-plugin.version>1.2</aspectj-maven-plugin.version> <maven-compiler-plugin.version>2.3.2</maven-compiler-plugin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties> ... <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>…
<plugin> <groupId>org.prehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>${aspectj-maven-plugin.version}</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 --> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${aspectj.version}</version> </dependency> <!-- <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-aspects</artifactId> <version>3.0.5.RELEASE</version> </dependency> --> </dependencies> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <outxml>true</outxml> <aspectLibraries> <aspectLibrary> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </aspectLibrary> <!-- <aspectLibrary> <groupId>org.springframework.security</groupId> <artifactId>spring-security-aspects</artifactId> </aspectLibrary> --> </aspectLibraries> <source>1.6</source> <target>1.6</target> <encoding>utf-8</encoding> </configuration> </plugin>spring配置:
<!-- Turn on AspectJ @Configurable support. As a result, any time you instantiate an object,Spring will attempt to perform dependency injection on that object.This occurs for instantiation via the "new" keyword, as well as via reflection.This is possible because AspectJ is used to "weave" Roo-based applications at compile time. In effect this feature allows dependency injection of any object at all in your system, which is a very useful feature (without @Configurable you'd only be able to dependency inject objects acquired from Spring or subsequently presented to a specific Spring dependency injection method). --> <context:spring-configured /> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> <!-- Spring Security: requires version 3.0.4 of Spring Security XSD: spring-security-3.0.4.xsd <global-method-security ... mode="aspectj"> -->
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)