Spring中创建切面 ---- 创建切入点
切入点:实际插入的连接点,通常通过指定的类名和方法名,或者匹配类名和方法样式的正则表达式来制定切入点
如果不能表达在应用系统的什么地方应用通知的话,通知将毫无用处,这就是切入点的用处。切入点决定了一个特定的类的特定方法是否满足一定的规则。若符合,通知就应用到该方法上。
Spring内容使用的是静态的切入点,返回的是true,只在代理创建的时候执行一次而不是在运行期间每次方法调用都执行,所以性能比动态切入点好,是首选的切入点方式。
Spring为创建静态切入点提供了方便的父类。 staticMethodMatcherPointcut.是抽象的父类,实现的子类为NameMatchMethodPointcut
1.我们首先来实现通过指定的方法名来创建切入点,在bean.xml中
<!-- 在业务bean的指定的方法上引入相应的bean -->
<bean id="nameMatchMethodPointcutAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<!-- 属性配置 一个或n个切入点 方法匹配器 -->
<property name="mappedNames">
<list>
<!-- display是方法,如果指定写入到方法,就会执行下面的指定的通知但是在测试的时候输出的方法和这里定义的方法才可以 -->
<value>display</value>
</list>
</property>
<!— 一下是通知 -- 切入点执行的环绕通知 -->
<property name="advice">
<ref bean="myAroundAdvice" />
</property>
</bean>
2.采用正则表达式创建切入点
<!-- 采用的是正则表达式匹配器 RegexpMethodPointcutAdvisor -->
<bean id="regexpMethodPointcutAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="patterns">
<list>
<!--写正则的时候要在方法的前面加上.*或.+和在后面加上.*
. 匹配任何单个字符
+ 匹配前一个字符一次或多次
* 匹配前一个字符0次或多次
-->
<value>.*stu.*</value>
</list>
</property>
<property name="advice">
<ref bean="myBeforeAdvice" />
</property>
</bean>
所引用的环绕和前置通知的bean.xml为:
<!-- 配置环绕通知 -->
<bean id="myAroundAdvice" class="cn.csdn.hr.advice.MyAroundAdvice" />
<!-- 配置前置通知 -->
<bean id="myBeforeAdvice" class="cn.csdn.hr.advice.MyBeforeAdvice" />
用到的环绕类为:
package cn.csdn.hr.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactoryBean;
public class MyAroundAdvice implements MethodInterceptor{
//创建自己环绕的通知
@Override
public Object invoke(MethodInvocation methodInvoaction) throws Throwable {
System.out.println("执行方法之前执行操作");
//执行目标方法
Object object = methodInvoaction.proceed();
System.out.println("执行方法之后执行操作");
return object;
}
}
用到的前置类为:
package cn.csdn.hr.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice {
/**
* 第一个参数:方法对象 第二个参数:方法参数 第三个对象:目标对象
*/
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
Object obj = null;
if (args.length > 0) {
obj = args[0];
System.out.println("-----------before-------方法名称:"
+ method.getName() + "-----第一个参数值----------:"
+ obj.toString() + "-------目标对象--------:" + obj.getClass());
}
}
}
测试类为:
public void test() {
// 获取应用程序上下文对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
PersonService personService = (PersonService) ac.getBean("personServiceBean");
personService.display("老王");
}
注:方法display是service中封装的一个方法
Spring中创建切面 ---- 创建切入点
最新推荐文章于 2021-04-18 18:20:47 发布