Spring中创建切面 ---- 创建切入点

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中封装的一个方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP (Aspect-Oriented Programming) 的四个主要切面通常包括:通知(Advice)、切入点(Pointcut)、连接点(Join Point)和切面(Aspect)。下面是它们的简要介绍: 1. **通知(Advice)** - 是AOP的核心,它是定义在切面的行为,可以是前置通知(Before)、后置通知(After)、返回通知(After Returning)或异常通知(AfterThrowing)。通知可以在特定的连接点执行,如方法调用前后。 ```java @Before("execution(* com.example.service.*(..))") // 前置通知 public void beforeAdvice(JoinPoint joinPoint) { // 业务逻辑... } ``` 2. **切入点(Pointcut)** - 定义了通知应该何时执行,它描述了一个或者一组方法签名。Spring AOP使用Spring Expression Language (SpEL) 来编写表达式来匹配方法或类型。 3. **连接点(Join Point)** - 是AOP的核心概念,它是指程序执行过程的一个特定时刻,比如方法调用、构造函数调用等。通知就是在这些连接点上插入的。 4. **切面(Aspect)** - 是一个模块化的、可重用的代码单元,它包含了一组相关的通知。切面由一个或多个通知组成,它们共享相同的切入点。 例如,一个简单的切面可能如下定义: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*(..))") public void logBefore(JoinPoint joinPoint) { // 打印日志... } // 其他通知... } ``` 这里,`LoggingAspect`是一个切面,它定义了一个`logBefore`前置通知,会在`com.example.service`包下的所有方法执行之前被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值