关于aop的一些基础概念可以看 spring aop|一些相关概念
作用:用于表示开始aop的配置
出现位置:写在beans标签的内部
属性:
Aspect概念:一个模块具有一组提供横切需求的 APIs。
例如,一个日志模块为了记录日志将被 AOP 方面调用。应用程序可以拥有任意数量的方面,这取决于需求。
简单的说就是用于被调用的方法前后增强的那些方法对应的那个类
简单的说这个是对被代理的函数的一个配置,也就是给谁添加上那些前后环绕的增强的代码,pointcut表达式就是通过一种表达式的方式去匹配符合表达式的函数
pointcut表达式的编写详见 spring aop|切入点pointcut表达式编写方案示例
它们只能出现在aop:aspect标签内部
环绕通知,它是有别于前面四种通知类型外的特殊通知。前面四种通知(前置,后置,异常和最终)它们都是指定何时增强的通知类型。而环绕通知,它是Spring框架为我们提供的一种可以通过编码的方式,控制增强代码何时执行的通知类型。它里面借助的ProceedingJoinPoint接口及其实现类,实现手动触发切入点方法的调用。
beans配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="aspect" class="com.kehao.aspect.MyLogAspect"></bean>
<bean id="student" class="com.kehao.pojo.Student"></bean>
<aop:config>
<aop:aspect id="log" ref="aspect">
<aop:pointcut id="speak" expression="execution(* com.kehao.pojo.Student.speak(..))"/>
<aop:before method="logBefore" pointcut-ref="speak"/>
<aop:after-returning method="logAfterReturn" pointcut-ref="speak"/>
<aop:after-throwing method="logAfterThrowException" pointcut-ref="speak"/>
<aop:after method="logAfter" pointcut-ref="speak"/>
</aop:aspect>
</aop:config>
</beans>
MyLogAspect.java
public class MyLogAspect {
public void logBefore(JoinPoint joinPoint) throws Throwable {
System.out.println("[logBefore]");
}
public void logAfterReturn(JoinPoint joinPoint) throws Throwable {
System.out.println("[logAfterReturn]");
}
public void logAfterThrowException(JoinPoint joinPoint) throws Throwable {
System.out.println("[logAfterThrowException]");
}
public void logAfter(JoinPoint joinPoint) throws Throwable {
System.out.println("[logAfter]");
}
}
Student.java
public class Student {
public void speak(){
System.out.println("i love Java!");
}
}
测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class StudentTest {
@Autowired
private Student student;
@Test
public void speak() {
student.speak();
}
}
具体代码详见:https://github.com/chenkehao1998/JavaExampleForBlog/tree/main/spring_aop_xml
原文:https://www.cnblogs.com/kehao/p/14670674.html