Spring之AOP

  1. 连接点:AOP关注的类中的具有特定功能的方法叫连接点
  2. 切入点:被抽取公共功能的连接点叫切入点
  3. 通知:切入点对应的方法的共性功能被抽取后,组成独立的代码逻辑,被封装在某个类中的某个方法中,在被抽取了共性功能的方法被执行时,这些代码逻辑还要加入原始方法的执行,这些被抽取出来组成独立代码逻辑的共性功能成为通知.共性功能被抽取后,可能来自于切腹点对应的方法中的任何位置,因此通知不仅描述共性的代码逻辑,还描述被抽取时从何处抽取.被抽取的代码在切入点中的具体位置,称为通知类别.
  4. AOP代理:切入点所在类的对象执行切入点方法时,需要将原始的共性功能(通知)加入还原,此时通过代理的形式创建类的对象,并完成共性功能(通知)的加入,上述过程称为AOP代理.AOP代理的意义是将被抽取共性功能类的对象创建出,同时将共性功能(通知)加入,完成原始的完整操作的过程.
  5. 切面(Aspect):是一个设计概念,指切入点与通知的匹配模式,换句话说指被抽取了共性功能的方法(切入点)与被抽取了共性功能(通知)对应的绑定关系.程序设计时,可以设置多个切面,用来描述切入点与通知之间的关系.
  6. 织入(Weaving):通过AOP代理,完成了切入点和通知的融合,并组织成了完整的代码逻辑,并通知加入到切入点对应位置的动作称为织入.织入是一个动态过程,不对应任何代码,可以理解为动态的运行过程(即运行时动态在切入点还原通知).织入可以在三个阶段进行,编译时,类加载时和运行时.Spring采用的是运行时织入.
  7. 目标对象:被抽取共性功能所在的类的对象.
  8. 8.

XML配置开发AOP

导入jar包

  1. 基本:Spring四个核心包两个日志包
  2. AOP相关jar包:
    Spring进行AOP开发(1个)
    spring-aop-3.2.0.RELEASE.jar
    Spring整合AspectJ框架
    spring-aspects-3.2.0.RELEASE.jar
    AOP联盟规范(dependencies包中)
    com.springsource.org.aopalliance-1.0.0.jar
    aspectJ支持(dependencies包中)
    com.springsource.org.aspectJ.weaver-1.6.8.RELEASE.jar

    导入aop命名空间

<beans xmlns="..."
...
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="...
...
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">

关于加入命名空间后标签没有提示的操作方法:
复制xsi中xsd那一行,windows->preferences->搜索xml->xml Catalog->add->key:粘贴,location:选择你想要找的命名空间的schema位置,keyvalue:选择uri

<!--aop配置-->
<aop:config>
    <!--切面aspect配置,切入点和通知的匹配方式
        ref:通知所在类
        before:描述通知所在的位置
        method:通知方法
        pointcut:切入点 第一个*是指任何返回类型,后面指全类名.(全部方法)(无论什么参数)
    <aop:aspect ref="">
        <aop:before method="beginTransaction" pointcut="execution(* com.test.service.UserServiceImpl.*(..))"/>
    </aop:aspect>
</aop:config>

AOP通知类型
1. before:前置通知类型(应用:各种校验),在方法执行前执行
2. after:后通知(应用:清理现场),方法执行完毕后执行,无论方法中是否出现异常
3. afterReturning:返回后通知(应用:常规数据处理),方法正常返回后执行,如果方法中抛出异常,无法执行
4. afterThrowing:抛出异常后通知(应用:包装异常信息),方法抛出异常后执行,如果没有抛出异常则无法执行
5. around:环绕通知(应用:十分强大,可以做任何事情)方法执行前后分别执行,可以阻止方法的执行

public class LogManager{
    //通知
    public void addLog(JoinPoint jp){
        //获取切入点的方法名:用户操作
        String methodName = jp.getSignature().getName();
        Date time = new Date();
        //处理用户操作:比如当出现不当操作时记录日志,或存入数据库
}
}

AOP注解

1.applicationContext.xml中开启aop注解

<!--开启aop注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

2.配置切面类

@Component(value="tx")
@Aspect//切面类
public class TransactionManager{
    //通知
    @Before(value="execution(*com.test.service.*.*(..))")
    public void beginTransaction()
    {
        System.out.println("开启事务");
    }
    @AfterReturning(value="execution(*com.test.*.*(..))")
    public void commitTransaction()
    {
        System.out.println("提交事务");
    }
    @AfterThrowing(value="execution(*com.test.*.*(..))")
    public void rollbackTransaction()
    {
        System.out.println("回滚事务");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值