Spring的AOP介绍
通知(Advice): 除了目标方法以外的操作都称之为通知
切入点(PointCut): 要为哪些类中的哪些方法加入通知
切面(Aspect): 通知 + 切入点
1.通知分类
1. 前置通知
MethodBeforeAdvice 前置通知接口
2. 后置通知
MethodInterceptor 环绕通知接口
3. 环绕通知
AfterReturningAdvice 返回后通知接口
4. 异常通知
ThrowsAdvice 异常通知接口
2.编程步骤
# 1.引入依赖
spring-aop
spring-expression
spring-aspects
# 2.开发通知类
MyAdvice implements 通知接口{.....}
//自定义通知类:用来完成额外功能
public class MyAdvice implements MethodBeforeAdvice {
@Override//参数1:当前调用的方法对象 //参数2:当前调用方法对象的参数 //参数3:目标对象
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("目标方法名: "+method.getName());
System.out.println("目标方法的参数: "+objects);
System.out.println("目标对象: "+o.getClass());
}
}
# 3.配置切面
a.引入aop命名空间
<?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 http://www.springframework.org/schema/aop/spring-aop.xsd">
b.管理通知
<!--管理通知类-->
<bean id="myAdvice" class="com.codegzy.before.MyAdvice"/>
c.配置切面
<aop:config>
<aop:pointcut id="pc" expression="execution(* com.codegzy.before.UserServiceImpl.*(..))"/>
<aop:advisor advice-ref="myAdvice" pointcut-ref="pc"/>
</aop:config>
# 4.启动工厂测试
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userSerivce = (UserService) context.getBean("userService");
System.out.println(userSerivce.getClass());
userSerivce.save("gzy");
3.切点表达式
1.execution方法级别的切入点表达式
2.within类级别的切入点表达式
# 1.语法
within(包.类)
# 2.示例
within(com.codegzy.service.*)
包: com.codegzy.service
类: 所有类中所有方法不关心返回值和参数
within(com.codegzy.service.UserServiceImpl)
包: com.codegzy.service
类: UserServiceImpl类中所有方法不关心返回值和参数