如果不能表达在应用系统得什么地方应用通知的话,通知将毫无用处,这就是切入点的用处。切入点决定了一个特点的类的特定方法是否满足一定的规则。若符合,通知就应用到该方法上。
Spring根据需要织入通知的类和方法来定义切入点。通知是根据其特性织入目标类和方法。Spring的切入点框架的核心接口是Pointcut
接口MethodMatcher三个方法,用在被代理对象生命周期的特定时期
1、 matches(Method,Class)方法根据目标和方法决定一个方法是否被通知,在AOP代理被创建时调用一次,其结果决定通知是否被织入
2、 若matches(Method,class)返回true,isRuntime()调用来决定MethodMatcher的类型:静态和动态(静态切入点通知总是被执行,如一个切入点是静态的,isRuntime()方法返回false;动态切入点根据运行时方法的参数值决定通知是否执行,若一个切入点是动态的,isRuntime()方法返回true),在代理类创建时调用一次。
3、 如一个切入点是静态的,matches(Method,Class,Object[])方法被调用
下面是一些在xml文件中配置切入点的一些代码
在业务bean指定的方法上引入通知
方式一:
<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<!-- 属性配置 一个切入点 -->
<property name="mappedNames">
<list>
<value>study</value>
</list>
</property>
<!-- 切入点上执行的通知 环绕通知 -->
<property name="advice">
<ref bean="myAroundAdvice"/>
</property>
</bean>
方式二:采用的是正则表达式匹配器
.匹配任何单个字符
+匹配前一个字符一次或多次
*匹配前一个字符0次或多次
\匹配任何正则表达式符号
<bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="patterns">
<list>
<!-- 正则表达式必须以.*或.+等开头 -->
<value>.*stu.*</value>
</list>
</property>
<property name="advice">
<ref bean="myBeforeAdvice"/>
</property>
</bean>
通过上面的配置就可以在指定的方法调用时添加相应的通知
其实上面在xml文件中的配置算是一种手动的插入切入点的方法,下面说一种自动插入的方法
方式一:名称代理,根据bean id=”….”
<bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Bean</value>
</list>
</property>
<property name="interceptorNames">
<list>
加环绕通知
<value>myAroundAdvice</value>
</list>
</property>
</bean>
方式二:自动装配advisor
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
利用注解引入通知----------整个案例
EmployeeService接口
public interface EmployeeService {
//工作
public void work();
}
EmployeeServiceBean类实现上述接口
public class EmployeeServiceBean implements EmployeeService{
@Override
public void work() {
// TODO Auto-generated method stub
//int i=1/0;
System.out.println("++++++++++++++++++工作中+++++++++++++++++");
}
}
定义一个切面类
@Aspect
public class AspectUtil {
//execution切入点指示符 第一个参数方法的修饰符 第二个参数代表方法返回类型【*.*work代表----包名+类名 . 包下的所有类中带work的方法】 第三个参数代表方法参数
/*
* (..)表示参数任意
* 包名后面有两个..代表当前包与当前包的子包
*/
//声明一个切入点
@Pointcut("execution(* *.*work(..))")
public void disp(){}
/*@Before("execution(* cn.csdn.service.EmployeeServiceBean.*(..))")*/
@Before("disp()")
public void getUp() {
// TODO Auto-generated method stub
System.out.println("小爽 该起床啦***********************");
}
@Around("disp()")
public Object punchCard(ProceedingJoinPoint jp) throws Throwable{
System.out.println("===============上班打卡================");
Object obj=jp.proceed();
System.out.println("===============下班打卡================");
return obj;
}
@After("disp()")
public void goHome() {
// TODO Auto-generated method stub
System.out.println("终于可以回家啦 -_-");
}
@AfterThrowing("disp()")
public void unwell(){
System.out.println("。。。。。。。。。。。。。不舒服啦。。。。。。。。。。。。");
}
}
在xml文件中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" >
<!-- 声明通知 -->
<bean id="AspectUtil" class="cn.csdn.advice.AspectUtil"></bean>
<bean id="myAspectAdvice" class="cn.csdn.service.MyAspectAdvice"></bean>
<!-- 配置一个业务bean -->
<bean id="employeeServiceBean" class="cn.csdn.service.EmployeeServiceBean"></bean>
<!-- 添加 能够使用注解 -->
<aop:aspectj-autoproxy/>
</beans>
注:使用spring的静态切入点静态切入点只在代理创建的时候执行一次而不是在运行期间每次方法调用都执行,所以性能 比动态切入点好,是首选的切入点方式。spring为创建静态切入点提供了方便的父类
当调用的方法名字与给出的映射名字匹配时, 切点才匹配。也可在名字的开始和结束使用通配符
Spring切入点
最新推荐文章于 2023-12-29 09:41:14 发布