深入理解JoinPoint

20 篇文章 0 订阅

一、概念

JoinPoint 是面向切面编程(AOP)中的一个概念。它表示目标类连接点对象,表示在程序执行过程中,可以插入额外逻辑的特定点。在 AOP 中,JoinPoint 是程序执行过程中的一个特定位置,例如方法调用、方法执行前后、异常抛出等。通过在 JoinPoint 上定义切面(Aspect),可以在程序执行过程中动态地插入切面逻辑,实现横切关注点的模块化和复用。简而言之,JoinPoint 是在 AOP 中表示程序执行过程中的特定位置或事件。

该接口封装了Spring中切面相关信息,一般在切面( @Before、@After、@AfterReturning、@AfterThrowing)方法中需要添加JoinPoint参数,作为形参。

二、JoinPoint

常用方法

接口中所有方法,如下图:
在这里插入图片描述

  • Object getThis():获取代理对象
  • Object getTarget():获取被代理对象
  • Object[] getArgs():获取目标方法的参数列表
  • Signature getSignature():返回被增强的方法的相关信息(修饰符+包名+类名+方法名)

三、ProceedingJoinPoint

ProceedingJoinPoint是JoinPoint的子接口,该对象只在@Around的切面方法中
在这里插入图片描述

常用方法

  • Object proceed() throws Throwable;
    执行目标方法

  • Object proceed(Object[] var1) throws Throwable;
    传入的新的参数去执行目标方法

四、例子

获取方法上的注解,实现滑动时间窗口算法

@Autowired
private SlideWindowUtils slideWindowUtils;
// 配置切入点
@Pointcut("@annotation(cn.lw.annotation.SlideWindowLimit)")
public void slideWindowLimitPointcut() {
}
@Around("slideWindowLimitPointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
	ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
	HttpServletRequest request = attributes.getRequest();
	// 获取注解属性
	SlideWindowLimit slideWindowLimit = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(SlideWindowLimit.class);
	if (slideWindowUtils.slideWindowAlgorithmByLua(request.getRequestURI(), slideWindowLimit.limitCount(), slideWindowLimit.period())) {
		return "操作过于频繁,请稍后重试";
	}
	return pjp.proceed();
}

具体代码可以查看Java自定义注解+AOP实现滑动时间窗口算法

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来为您解答这个问题。 首先,我们需要导入 iris 数据集和 scikit-learn 中的 svm 模块: ```python from sklearn import datasets from sklearn import svm import matplotlib.pyplot as plt import numpy as np iris = datasets.load_iris() X = iris.data[:, :2] # 只使用前两个特征 y = iris.target ``` 然后,我们可以使用 SVM 模型进行训练和预测,并输出决策边界的参数和截距、支持向量: ```python clf = svm.SVC(kernel='linear') clf.fit(X, y) # 输出决策边界的参数和截距 print("Coefficients:", clf.coef_) print("Intercept:", clf.intercept_) # 输出支持向量 support_vectors = clf.support_vectors_ print("Support Vectors:", support_vectors) ``` 最后,我们可以将数据集和决策边界可视化: ```python # 生成网格点坐标 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) # 预测网格点的标签 Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制数据集和决策边界 plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8) plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm) plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100, facecolors='none', edgecolors='k') plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.title('SVM for iris dataset') plt.show() ``` 运行以上代码,即可得到决策边界和支持向量的可视化结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值