AOP面向切面编程

传统的面向对象编程弊端:

同样的add()方法中,可能含有相同的代码,可以抽取出来。变成x()方法
但是一旦x()方法改名,或者逻辑变了需要定义在add之前。。。。后果不堪设想
 
AOP面向切面编程很好的解决了这一弊端

前置通知:在特定的方法之前通知。
异常通知:在方法发生异常通知
环绕通知:前后都可以通知
 
通知的实现步骤:
  1. 导入jar包
    1. aopaliance.jar
    2. aspectjweaver.jar
  2. 配置:
<!--切入点所在的类-->
<bean id="StudentService" class="com.serviceimpl.StudentServiceImpl">
    <property name="studnetdao" ref="studentdao"></property>
</bean>
可以写前置通知,后置通知。。。。。。。
<!--    前置通知类-->
    <!--    ===============连接线的一端================-->
    <bean id="logbefore" class="com.normal.logBefore"></bean>

 

<!--    将切入点和通知进行关联-->
    <aop:config>
        <!-- 配置切入点(在哪里进行通知)-->
        <!--    ===============连接线的另一端================-->
        <aop:pointcut id="point" expression=" execution(public void com.service.StudentService.delStudentById(int)) or execution(public void com.service.StudentService.addStudent(com.entity.Student))"/>
        <!--advisor相当于链接切入点和切面的线-->
        <!--==========连接线=====-->
        <aop:advisor advice-ref="logbefore" pointcut-ref="point"></aop:advisor>
    </aop:config>
<aop:pointcut id="point" expression=" execution()"/>
execution()中填写的 切入点的方法声明,当一个切入面有多个切入点时:多个方法声明中 用”or“相连。并且,切入点的方法只需要写明类型即可,不需要写变量。

 前置通知的具体实现

public class logBefore implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("前置通知!!!");
    }
}

上述说的是约定条件

异常通知:
实现了异常接口,虽然里面没有抽象方法,但是需要编写编写一下方法:
  1. public void afterThrowing(Method method,Object[] args,Object target,ThrowableSubclass o)
  2. public void afterThrowing(ThrowableSubclass o)
编写上述其中之一的方法就行,
参数列表分别是:
  1. 切入点
  2. 切入点的参数列表
  3. 调用切入点的对象
  4. 抛出的异常类
posted @ 2020-12-31 17:11  James_Harden  阅读(63)  评论(0编辑  收藏  举报