Spring Aop切面编程配置与实现

Spring Aop切面编程配置与实现
(基于注解)

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)
的补充和完善。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模
块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于
减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
其实我们日常编程的时候,写代码除了面向对象外,还应该保证代码的“横切”层次感。一旦后面业务逻辑有变更,我们可以找到合理
的位置插入新的业务逻辑。这个合理的位置就是各横切层之间,如果代码的“横切”层次好,后面维护代码加逻辑那都是分分钟。
一、关键配置
其实这个配置很简单,百度一下就可以搜索到,spring的版本不同,大体配置基本没有变化,今天我们先说说简单配置,下期再说说
动态代理。
找到spring的配置文件,这个文件不一定就叫application.xml哦,可以在这个文件 里引入其他xml的,我这里的叫coshipcorecontext.
xml。关键配置如下:
1、beans标签加入
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="里加入http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
2、beans标签节点里增加
<aop:aspectj-autoproxy/>
<bean id="myInterceptor" class="com.coship.core.interceptor.MyInterceptor"/>
bean配置的是自定义的切面类(Interceptor)英文翻译是拦截机、通道的意思。
配置就完成了。
ps:如果项目采用的是扫描器扫描类加载,不需要自己配置bean,第2点都可以省略的,修改下扫描规则就可以了。
二、切面类
直接上代码
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Aspect
public class MyInterceptor {
private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
@Pointcut("execution (* com.coship.cms.manager.main.impl.*.*(..))")
private void anyMethod() {}//声明一个切入点
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name) {
log.info("前置通知:"+ name);
}
@AfterReturning(pointcut="anyMethod()",returning="result")
public void doAfterReturning(String result) {
log.info("后置通知:"+ result);
}
@After("anyMethod()")
public void doAfter() {
log.info("最终通知");
}
@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e) {
log.info("例外通知:"+ e);
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
//log.info("进入方法");
Object result = pjp.proceed();
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Object target = pjp.getTarget();
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
String methodName = currentMethod.getName();
//log.info("退出方法:");
StringBuffer sbf = new StringBuffer();
sbf.append("执行了方法:"+target.getClass()+"."+methodName+"(");
//访问目标方法的参数:
Object[] args = pjp.getArgs();
if (args != null && args.length > 0) {
for(int i = 0;i < args.length;i++) {
Object parmObj = args[i];
//其实可以用反射判断类型,再确定是否toString或其他方法
if(parmObj != null) {
sbf.append(parmObj.toString());
}else {
sbf.append(parmObj);
}
if(i != (args.length - 1)) {
sbf.append(",");
}
}
sbf.append(")");
}
log.info(sbf.toString());
return result;
}
}
注意Pointcut的配置,这里是模糊配置,即com.coship.cms.manager.main.impl下的所有实现类都增加这个切面拦截。

效果:


下面补充注解标签的相关知识:
AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或
者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
9、@Before 前置
10、@AfterReturning 后置
11、@Around 环绕
12、@AfterThrowing 抛出异常
13、@After 最终
15、Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或Field.
16、Target(目标对象):代理的目标对象
17、Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
aop的简单使用就这样ok了,下期写写自动代理或Spring AOP和AspectJ的区别。spring真是好东西,我个人比较喜欢它的注解,不喜欢
写配置。
昨天写完这个实现,想到很多场景:
1、日志的记录
2、结合jmail实现危险操作邮件通知
3、后期配合junit重现业务数据bug查找
4、行为上报(目前的行为上报都是终端做,其实我觉得后台也是可以做行为上报的)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥仔哥哥1930

来一波支持,吃不了亏上不了当

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值