本文转自网络
和Spring1.X相比,Spring2.X使用ASPectJ的语法来声明AOP,这使得它更“标准”,更灵活了。还是那句话,如果你不了解AspectJ并且打算使用Spring2.X的AspectJ式AOP,那就学学AspectJ吧,这方面的书还是很多了。
Spring2.X下的切面有两种实现方式,一种是以Java文件定义切面(其只是普通的Java类),然后在配置文件中声明定义的切面;另一种是在Java类中引入和AOP相关的元数据(注释)。
先介绍第一种配置方式。需要指出的是,Spring2.X的beans名称空间和Spring1.X有所不同,它采用了Schema而不是DTD(也可采用DTD方式,具体的请参考文档)。还是引入毫无意义的日志切面,定义的切面类LogingAspect 如下:
public class LogingAspect { public void logMethod(JoinPoint jp){ System.err.println(jp.getTarget().getClass()); System.err.println(jp.getSignature().getName()); } } |
同时在配置文件中如下配置:
< bean id = " logAspectTarget " class = " Hibernatesample.service.util.LogingAspect " > </ bean > < aop:config > < aop:aspect id = " logAspect " ref = " logAspectTarget " > < aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " /> < aop:after pointcut - ref = " businessService " method = " logMethod " /> </ aop:aspect > </ aop:config > |
对于上面的切面,切入点businessService是在配置文件中声明的,其表达式采用了 AspectJ的语法,LogingAspect 类中logMethod(JoinPoint jp)方法根据配置文件信息可知其是after通知,方法的JoinPoint参数不是必须的,它是来自于AspectJ的实用类,这里用它不过输出一些和连接点有关的信息。当然,在Spring2.X中,切入点和通知能更灵活的使用,我们可以如AspectJ一样传递参数给通知。如果需要在Service中引入事务功能,需要如下配置事务通知:
< tx:advice id = " txAdvice " transaction - manager = " transactionManager " > < tx:attributes > < tx:method name = " get* " read - only = " true " /> < tx:method name = " find* " read - only = " true " /> < tx:method name = " * " /> </ tx:attributes > </ tx:advice > < aop:config > < aop:pointcut id = " demoServiceMethods " expression = " execution(* hibernatesample.service.*.*(..)) " /> < aop:advisor advice - ref = " txAdvice " pointcut - ref = " demoServiceMethods " /> < aop:aspect id = " logAspect " ref = " logAspectTarget " > < aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " /> < aop:after pointcut - ref = " businessService " method = " logMethod " /> </ aop:aspect > </ aop:config > |
完成上面的工作相当于完成了 Spring1.X 的 自动代理。 我们接下来需要定义的任何 Service Bean 都可以很纯粹很纯粹了:
< bean id ="accountService" class ="hibernatesample.service.impl.AccountServiceImpl" > < property name ="accountDAO" ref ="accountDAO" ></ property > </ bean > |
第二种实现 AOP 的方式和第一种相比,只是在 LogingAspect 中加入了注释,而省去了配置文件中和 LogingAspect 相关的配置。重新编写的 LogingAspect 如下:
@Aspect
public class LogingAspect { @Pointcut( " execution(* hibernatesample.service.*.*(..)) " ) public void businessService(){} @After( " businessService() " ) public void logMethod(JoinPoint jp){ System.err.println(jp.getTarget().getClass()); System.err.println(jp.getSignature().getName()); } } |
而简化后的配置文件可以去除上面的如下和 logAspect 相关的配置信息:
< aop:aspect id ="logAspect" ref ="logAspectTarget" > < aop:pointcut id ="businessService" expression ="execution(* hibernatesample.service.*.*(..))" /> < aop:after pointcut-ref ="businessService" method ="logMethod" /> </ aop:aspect > < bean id ="logAspectTarget" class ="hibernatesample.service.util.LogingAspect" ></ bean >
|
还没有完,为了使 Spring 应用 LogingAspect 的注释,需要在配置文件中添上
<aop:aspectj-autoproxy/>
如果觉得事务的配置没有使用注释更简洁(我倒不会有这样的想法,毕竟在配置文件中声明的事务只是那么固定的几段,除非作用于类上的事务逻辑上很复杂),也可以使用Spring提供的事务注释作用于类文件上,这可是更细粒度的事务声明了。
坦率的说,由于时间有限,该文写的比较粗糙。对于Spring AOP有兴趣并有疑问的朋友,可以参考Spring的文档,它的文档做的还是不错的。
分享到:
相关推荐
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是对传统Object-Oriented Programming(面向对象编程,OOP)的一种补充。在OOP中,为了实现共享行为,如日志、权限验证和事务管理,往往需要在多个类...
在实际开发中,我们可以使用Spring AOP来实现如事务管理、日志记录等功能,避免在业务代码中插入这些与核心业务逻辑无关的代码,从而保持代码的清晰和简洁。通过理解Spring AOP的实现原理,开发者可以更好地设计和...
本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...
Spring框架是Java开发领域中最广泛使用的轻量级框架之一,其强大的功能和灵活性深受开发者喜爱。本文将深入探讨Spring框架的三个重要版本:Spring 3.1、3.2和3.3,揭示它们带来的新特性、改进和优化,帮助开发者更好...
2. **缓存配置**:在 Spring 配置文件中,我们需要定义哪些方法应该被缓存,以及使用哪个缓存 provider(例如 Ehcache、Redis)。这通常涉及到 `@EnableCaching` 注解来开启缓存支持,以及 `@CacheConfig` 注解来...
通过`factory-bean`和`factory-method`组合使用,指示Spring使用其他Bean的工厂方法来创建当前Bean。 Spring配置文件的灵活性和强大功能使得开发者能够精确地控制应用的组件。同时,随着Spring的发展,更多高级特性...
"浅析Java企业开发" 本文将对Java企业开发的现状和发展趋势进行探讨,并对Struts、Hibernate、MyBatis和Spring这些开源框架进行分析。 首先, Java企业开发存在技术陈旧、保守,交付周期长,对新技术、新趋势的...
在本文中,我们将深入探讨Spring框架中的IOC容器,特别是BeanFactory容器和ApplicationContext容器。 首先,Spring的IoC容器通过依赖注入(Dependency Injection,简称DI)来管理对象的生命周期和相互关系。DI是一...
- Spring:Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)架构模式等功能,还集成了数据访问、事务管理、安全性和测试工具。 - Struts:Struts是基于MVC设计模式...
为了构建复杂的企业级应用,Struts2通常会与其他框架如Hibernate(用于ORM)、Spring(用于IOC和AOP)集成,形成一套完整的开发解决方案。 #### 12. 实战项目示例 通过一系列实战项目,如投票管理系统、无纸化办公...
在Spring框架中,`refresh()`方法是启动和更新Spring应用程序上下文的关键步骤。这个方法主要分为以下几个阶段: 1. **准备预处理(prepareRefresh())**: 在这一阶段,Spring容器会记录启动时间、标记容器为活动...
在本压缩包中的"基于Java的Web开发技术浅析 (1).pdf"可能就包含了关于WAR文件的详细解析,以及如何在Web容器中部署和运行WAR文件的方法。 总的来说,Java Web开发技术是一个庞大的领域,涵盖了从服务器端编程、...
Spring提供了一整套服务,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等,极大地简化了企业级应用的开发。Spring Boot则进一步简化了Spring的配置,使得开发者可以快速启动和运行项目。 在实际开发中,我们...
- **开发工具**:Eclipse MARS.2 - **开发语言**:Java - **服务器**:Apache Tomcat 7.0 - **浏览器**:Firefox 51.0.1 - **硬件配置**:Core i7-7700HQ处理器、8GB DDR4内存、1TB机械硬盘 #### 五、项目实施计划 ...
- Struts2支持在配置文件和标签中使用OGNL表达式。 - **OGNL使用示例**: - 展示对象属性:`<s:textfield name="user.name" />`。 #### 十、上传下载 - **文件上传**: - 使用`<s:file>`标签上传文件。 - 在...