Spring源码学习(十五)---静态普通方法名匹配切面

一. AOP核心概念

1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)
对连接点进行拦截的定义

5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象
代理的目标对象

7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

二. Aop的切面介绍

  1. 增强包括横切代码,又包含部分连接点信息(方法前、方法后主方位信息),所以可以仅通过增强类生成一个切面。 但切点仅仅代表目标类连接点的部分信息(类和方法的定位),所以仅有切点无法制作出一个切面,必须结合增强才能制作出切面。Spring使用org.springframework.aop.Advisor接口标识切面概念,一个切面同时包含横切代码和连接点信息。
  2. 增强方法都会被应用到目标类的方法上,这样的增强效果肯定不能满足我们实际的应用,那么这个时候就需要引入一个概念----切入点(Pointcut)。通过切入点就可以有选择的将增强应用到目标类的具体某个方法上,而目标类的方法就是我们说的连接点。

三. 静态普通方法名匹配切面小案例

  1. 静态方法匹模式:所谓静态方法匹配器,仅对方法名签名(包括方法名和入参类型及顺序)进行匹配
  2. 静态方法切点–>org.springframework.aop.support.StaticMethodMatcherPointcut
    静态方法切点的抽象基类,默认情况下匹配所有的类。最常用的两个子类NameMatchMethodPointcut和 AbstractRegexpMethodPointcut , 前者提供简单字符串匹配方法签名,后者使用正则表达式匹配方法签名。

1. 接口和实现类(目标对象)

UserService 接口

package com.xizi.service;

public interface UserService {
    public  void delete();
}

UserServiceImpl 实现类1

package com.xizi.service;

public class UserServiceImpl implements UserService {

    public void delete() {
        System.out.println("删除了一个用户111111111111----测试该方法被增强,切入点设置在这个类上");
    }
}

UserServiceImpl2 实现类2

package com.xizi.service;

public class UserServiceImpl2 implements UserService {

    public void delete() {
        System.out.println("删除了一个用户2222222222----测试该方法没有被增强,切入点没有设置在这个类上");
    }
}

2. MyMethodBeforeAdvice 前置增强

MyMethodBeforeAdvice 前置增强

package com.xizi.log;

import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;

/**
 * 
 */
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {

	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("==前置增强开始==");
		System.out.println("==方法名=:" + method.getName());
		if (null != args && args.length > 0) {
			for (int i = 0; i < args.length; i++) {
				System.out.println("==第" + (i + 1) + "参数:" + args[i]);
			}
		}
		System.out.println("==目标类信息==:" + target.toString());
	}
}

3. 自定义静态普通方法名匹配切面 MyStaticPointcutAdvisor

自定义静态普通方法名匹配切面 MyStaticPointcutAdvisor

package com.xizi.advice;

import com.xizi.service.UserService;
import com.xizi.service.UserServiceImpl;
import com.xizi.service.UserServiceImpl2;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;

import java.lang.reflect.Method;

/**
 * 静态普通方法名匹配切面
 * @author: LiYanChao
 * @create: 2018-11-04 22:08
 */
public class MyStaticPointcutAdvisor extends StaticMethodMatcherPointcutAdvisor {

	private static String METHOD_NAME = "delete";

	/**
	 * 静态方法匹配判断,这里只有方法名为delete的,才能被匹配
	 */
	@Override
	public boolean matches(Method method, Class<?> targetClass) {
		return METHOD_NAME.equals(method.getName());
	}

	/**
	 * 覆盖getClassFilter,只匹配UserServiceImpl类
	 * @return
	 */
	public ClassFilter getClassFilter() {
		return new ClassFilter() {
			@Override
			public boolean matches(Class<?> clazz) {
				return UserServiceImpl.class.isAssignableFrom(clazz);
			}
		};
	}
}

在这里插入图片描述

4. 进行Aop切面+增强的测试

进行Aop切面+增强的测试


    @Test
    public void test1() {
        // 前置增强
        // 1、创建目标类、增强、切入点
        UserService userService = new UserServiceImpl();
        MyMethodBeforeAdvice advice = new MyMethodBeforeAdvice();
        MyStaticPointcutAdvisor advisor = new MyStaticPointcutAdvisor();
        // 2、创建ProxyFactory并设置代理目标和切面
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTarget(userService);
        // 为切面类提供增强
        advisor.setAdvice(advice);
        proxyFactory.addAdvisor(advisor);
        // 3、生成代理实例
        UserService proxyUser = (UserService) proxyFactory.getProxy();
        proxyUser.delete();
    }

实现类UserServiceImpl()的delete方法被增强,在配置中覆盖getClassFilter,只匹配UserServiceImpl类, 静态方法匹配判断,这里只有方法名为delete的,才能被匹配,我们使用切入点+增强类完成切面的测

在这里插入图片描述

该类中的方法并不会被增强,虽然里面有delete方法,但是该类并没有在切面配置中被设置被增强的类

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值