传统的面向对象编程弊端:
同样的add()方法中,可能含有相同的代码,可以抽取出来。变成x()方法
但是一旦x()方法改名,或者逻辑变了需要定义在add之前。。。。后果不堪设想
AOP面向切面编程很好的解决了这一弊端
前置通知:在特定的方法之前通知。
异常通知:在方法发生异常通知
环绕通知:前后都可以通知
通知的实现步骤:
- 导入jar包
- aopaliance.jar
- aspectjweaver.jar
- 配置:
<!--切入点所在的类-->
<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("前置通知!!!");
}
}
上述说的是约定条件
异常通知:
实现了异常接口,虽然里面没有抽象方法,但是需要编写编写一下方法:
- public void afterThrowing(Method method,Object[] args,Object target,ThrowableSubclass o)
- public void afterThrowing(ThrowableSubclass o)
编写上述其中之一的方法就行,
参数列表分别是:
- 切入点
- 切入点的参数列表
- 调用切入点的对象
- 抛出的异常类