about aop

博客围绕Java中AOP的应用展开,指出以日志为例讲解AOP并不合适,而事务、性能拦截器等与业务无关的代码适合用AOP。同时提到权限、Cache的AOP实现存在困难,如权限系统与业务代码耦合,Cache的AOP有特定约定,不够方便。
关于aop的问题,上次java聚会gigix讲了aop的各方面应用,举了一些很有说服力的例子,而且确实提到log粒度太小,而且分布在程序各处,除了操作流水性日志,实际上是不适合作aop的。后来下来和dlee讨论的时候一致认为现在外面
例子一讲aop就拿log作例子,实际上不是很合适。
其它一些与业务无关的代码,比如事务就非常适合做aop.
还有比如performanceInterceptor,在怀疑那个方法有性能问题时,直接在方法前后配上,就可以知道方法耗了多少时间.
至于通常说aop谈到的可以用权限作aspect,不过一般每个公司做的权限系统往往
和业务代码耦合,所以权限往往很难作aspect,不过ahbbxie说可以扩展jaas作
http://forum.javaeye.com/viewtopic.php?t=4117,有空到要研究一下。
还有Cache的aspect,也不是很好作,一种是约定头一个参数都是id,
一种是参数实现特定接口让cache aspect找的到,不过都有特定约定,
业务逻辑不能完全在unware的情况下做到透明Cache,然后还有object修改field时的跟新cache,以及不用时候evict等等,感觉都不是很方便,还不如直接传统的写法。
### 如何在Spring中使用AOP #### 一、AOP的概念及其意义 面向切面编程(Aspect-Oriented Programming, AOP)是一种通过分离横切关注点来增强程序结构的技术。这些横切关注点通常包括日志记录、安全性验证、事务管理等功能,它们往往跨越多个类或模块。传统的OOP方法很难有效地将这些功能封装到独立的单元中[^3]。 #### 二、Spring中的AOP实现方式 Spring 提供了灵活的方式来实现 AOP 功能,主要包括以下几种: 1. **基于注解的AOP** 这是最常用的方法之一,在定义切面时可以利用 `@Before`、`@AfterReturning` 和 `@Around` 等注解指定切入点的行为逻辑[^2]。 2. **基于XML配置的AOP** 使用 XML 文件声明切点和通知器,这种方式适合不希望污染业务代码场景下的开发需求。 3. **集成 AspectJ 的AOP** 如果需要更加精细控制或者复杂的功能,则可以选择引入 AspectJ 支持。相比纯 Spring 实现方案而言,它允许开发者编写更为强大的自定义行为模式[^4]。 #### 三、环境搭建与依赖设置 要启用 Spring 中的 AOP 特性,需添加相应 Maven 或 Gradle 构建工具所需的库文件作为项目依赖项。以下是两种常见情况下所需的具体依赖关系描述: 对于大多数现代应用来说,推荐直接采用 spring-boot-starter-aop 起步包完成初始化工作: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 如果计划深入探索并充分利用 AspectJ 所提供额外能力的话,则还需要单独加入下面这个组件版本号可能依据实际运行平台有所调整,请参照官方文档确认最新稳定版次信息后再做决定: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.0.0-M2</version> </dependency> ``` #### 四、简单示例说明 假设我们有一个服务类 ServiceExample ,想要为其所有公共方法执行前打印一条消息“Method is about to execute”。可以通过创建一个带有 @Aspect 注释的新Java 类,并在其内部定义相应的 Advice 来达成目标。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.ServiceExample.*(..))") public void logBefore() { System.out.println("Method is about to execute"); } } ``` 上述例子展示了如何轻松地向现有应用程序添加新特性而无需修改原始源码本身的内容结构形式。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值