问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring 中如何进行方法的判定

发布网友 发布时间:2022-05-13 23:30

我来回答

4个回答

热心网友 时间:2023-11-07 07:51

方法一 拦截指定的方法可以启用@AspectJ支持 这个方法面需要在原有代码中加入标注。具体做法可以参考Spring-Reference_zh_CN.chm。可以到满江红开源社区下载。
方法二 如果你是想拦截所有的类的doAction 方法你可以写一个接口,接口中声明doAction 方法,让所有类去实现这个接口,然后调用的时候转化为接口调用,这样就能拦截所有的doAction 方法了。这种做法也是需要修改代码。
方法三 最简单的方法 直接在拦截方法中过滤
写个例子吧
public void before(Method method, Object[] args, Object target)
throws Throwable {
if(method.getName()="doAction"){
//TODO: do something
}
}

热心网友 时间:2023-11-07 07:52

用AspectJ的语法就可以了!

热心网友 时间:2023-11-07 07:52

1、Spring只支持方法拦截,也就是说,只能在方法的前后进行拦截,而不能在属性前后进行拦截。
2、Spring支持四种拦截类型:目标方法调用前(before),目标方法调用后(after),目标方法调用前后(around),以及目标方法抛出异常(throw)。
3、前置拦截的类必须实现MethodBeforeAdvice接口,实现其中的before方法。
4、后置拦截的类必须实现AfterReturningAdvice接口,实现其中的afterReturning方法。
5、前后拦截的类必须实现MethodInterceptor接口,实现其中的invoke方法。前后拦截是唯一可以控制目标方法是否被真正调用的拦截类型,也可以控制返回对象。而前置拦截或后置拦截不能控制,它们不能影响目标方法的调用和返回。
但是以上的拦截的问题在于,不能对于特定方法进行拦截,而只能对某个类的全部方法作拦截。所以下面引入了两个新概念:“切入点”和“引入通知”。
6、”切入点“的定义相当于更加细化地规定了哪些方法被哪些*所拦截,而并非所有的方法都被所有的*所拦截。在ProxyFactoryBean的属性中,interceptorNames属性的对象也由拦截(Advice)变成了引入通知(Advisor),正是在Advisor中详细定义了切入点(PointCut)和拦截(Advice)的对应关系,比如常见的基于名字的切入点匹配(NameMatchMethodPointcutAdvisor类)和基于正则表达式的切入点匹配(RegExpPointcutAdvisor类)。这些切入点都属于”静态切入点“,因为他们只在代理创建的时候被创建一次,而不是每次运行都创建。

下面我们进行实例的开发

首先创建业务接口:

package AdvisorTest;

public interface Shopping ...{
public String buySomething(String type);
public String buyAnything(String type);
public void testException();
}

下面是业务实现类,我们的通知就是以这些实现类作为切面,在业务方法前后加入我们的通知代码

package AdvisorTest;

public class ShoppingImpl implements Shopping ...{
private Customer customer;
public Customer getCustomer() ...{
return customer;
}
public void setCustomer(Customer customer) ...{
this.customer = customer;
}
public String buySomething(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;
}

public String buyAnything(String type) ...{
System.out.println(this.getCustomer().getName()+" bye "+type+" success");
return null;

}
public void testException()...{
throw new ClassCastException();
}
}

(1)前置通知

配置了前置通知的bean,在执行业务方法前,均会执行前置*的before方法

package AdvisorTest;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
//前置通知
public class WelcomeAdvice implements MethodBeforeAdvice ...{

public void before(Method method, Object[] args, Object obj)
throws Throwable ...{
String type=(String)args[0];
System.out.println("Hello welcome to bye "+type);

}

}

(2)后置通知

配置了后置通知的bean,在执行业务方法后,均会执行后置*的afterReturnning方法 package AdvisorTest;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
//后置通知
public class ThankYouAdvice implements AfterReturningAdvice ...{

public void afterReturning(Object obj, Method method, Object[] arg1,
Object arg2) throws Throwable ...{

String type=(String)arg1[0];
System.out.println("Hello Thankyou to bye "+type);
}

}

(3)环绕通知

配置了环绕通知的bean,在执行业务方法前后,均会执行环绕*的invoke方法

需要注意的是必须调用目标方法,如不调用,目标方法将不被执行

package AdvisorTest;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MethodAdvisor implements MethodInterceptor ...{

public Object invoke(MethodInvocation invocation) throws Throwable ...{
String str=(String)invocation.getArguments()[0];
System.out.println("this is before"+str+" in MethodInterceptor");
Object obj=invocation.proceed(); //调用目标方法,如不调用,目标方法将不被执行
System.out.println("this is after"+str+" in MethodInterceptor");
return null;
}

}

(4)异常通知

ThrowsAdvice是一个标示接口,我们可以在类中定义一个或多个,来捕获定义异常通知的bean抛出的异常,并在抛出异常前执行相应的方法

public void afterThrowing(Throwable throwa){}或者

public void afterThrowing(Method method,Object[] args,Object target,Throwable throwable){

package AdvisorTest;

import org.springframework.aop.ThrowsAdvice;

public class ExceptionAdvisor implements ThrowsAdvice ...{
public void afterThrowing(ClassCastException e)...{
System.out.println("this is from exceptionAdvisor");
}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
<bean id="customer" class="AdvisorTest.Customer">
<constructor-arg index="0">
<value>gaoxiang</value>
</constructor-arg>
<constructor-arg index="1">
<value>26</value>
</constructor-arg>
</bean>

<bean id="shoppingImpl" class="AdvisorTest.ShoppingImpl">
<property name="customer">
<ref local="customer"/>
</property>
</bean>

<!-- 前置通知 -->
<bean id="welcomeAdvice" class="AdvisorTest.WelcomeAdvice"/>
<bean id="welcomeAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>AdvisorTest.Shopping</value>
</property>
<property name="target">
<ref local="shoppingImpl"/>
</property>
<property name="interceptorNames">
<list>
<value>welcomeAdvice</value>
</list>
</property>

</bean>

<!-- 后置通知 -->
<bean id="thankyouAdvice" class="AdvisorTest.ThankYouAdvice"/>
<bean id="thankyouAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>AdvisorTest.Shopping</value>
</property>
<property name="target">
<ref local="shoppingImpl"/>
</property>
<property name="interceptorNames">
<list>
<value>thankyouAdvice</value>
</list>
</property>

</bean>

<!-- 环绕通知 -->
<bean id="methodAdvice" class="AdvisorTest.MethodAdvisor"/>
<bean id="methodAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>AdvisorTest.Shopping</value>
</property>
<property name="target">
<ref local="shoppingImpl"/>
</property>
<property name="interceptorNames">
<list>
<value>methodAdvice</value>

</list>
</property>
</bean>

<!-- 异常通知 -->
<bean id="exceptionAdvice" class="AdvisorTest.ExceptionAdvisor"/>
<bean id="exceptionAdviceShop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>AdvisorTest.Shopping</value>
</property>
<property name="target">
<ref local="shoppingImpl"/>
</property>
<property name="interceptorNames">
<list>
<value>exceptionAdvice</value>

</list>
</property>
</bean>
</beans>

测试代码:

package AdvisorTest;

import java.io.File;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class TestAdvisor ...{

public static void main(String[] args) ...{

String filePath=System.getProperty("user.dir")+File.separator+"AdvisorTest"+File.separator+"hello.xml";

BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));

Shopping shopping=null;
System.out.println("不使用任何通知");
shopping=(Shopping)factory.getBean("shoppingImpl");
shopping.buySomething("something");
shopping.buyAnything("anything");

System.out.println("使用前置通知");
shopping=(Shopping)factory.getBean("welcomeAdviceShop");
shopping.buySomething("something");
shopping.buyAnything("anything");

System.out.println("使用后置通知");
shopping=(Shopping)factory.getBean("thankyouAdviceShop");
shopping.buySomething("something");
shopping.buyAnything("anything");

System.out.println("使用环绕通知");
shopping=(Shopping)factory.getBean("methodAdviceShop");
shopping.buySomething("something");
shopping.buyAnything("anything");

System.out.println("使用异常通知");
shopping=(Shopping)factory.getBean("exceptionAdviceShop");
shopping.testException();

}
}

运行结果一目了然:

不使用任何通知
gaoxiang bye something success
gaoxiang bye anything success
使用前置通知
Hello welcome to bye something
gaoxiang bye something success
Hello welcome to bye anything
gaoxiang bye anything success
使用后置通知
gaoxiang bye something success
Hello Thankyou to bye something
gaoxiang bye anything success
Hello Thankyou to bye anything
使用环绕通知
this is beforesomething in MethodInterceptor
gaoxiang bye something success
this is aftersomething in MethodInterceptor
this is beforeanything in MethodInterceptor
gaoxiang bye anything success
this is afteranything in MethodInterceptor
使用异常通知
this is from exceptionAdvisor

热心网友 时间:2023-11-07 07:53

根据action的名字来判断撒 没必要根据方法名来判断
spring的趣味记忆(spring单词记忆)

记忆方法:发音想成“爱苛求”(由于爱苛求,所以必须是实际的,可行的才行) acumen 中文解释:敏锐,聪明 记忆方法:发音想成“阿Q们”(阿Q能发明精神胜利法,也算聪明的) adequate 中文解释:充分的,足够的,胜任的 记忆方法:发音想成“俺得夸他”(因为他做得足够的好,能胜任那项工作,所以俺得夸他。)adhere 中文解释...

图文并茂,揭秘 Spring 的 Bean 的加载过程

调用判定的地方在 AbstractBeanFactory.doGetBean 中,所有对象的实例化均会从这里启动。 判定的实现方法为 AbstractBeanFactory.isPrototypeCurrentlyInCreation : 所以在原型模式下,构造函数循环依赖和设值循环依赖,本质上使用同一种方式检测出来。Spring 无法解决,直接抛出 BeanCurrentlyInCreationException 异常。 Spring 也...

Spring中IoC的入门实例详解

创建一个工厂类Factory 如下 这个工厂类里定义了两个字符串常量 所标识不同的人种 getHuman方法根据传入参数的字串 来判断要生成什么样的人种 package chengang spring;public class Factory {public final static String CHINESE = Chinese ;public final static String AMERICAN = American ;public Human ...

springcloud-熔断Hystrix

跳闸机制 :当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。资源隔离 :Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。监控 :Hystrix可以近乎实时地监控运行指标...

微服务异常的三种场景和处理方法

Step1、隔离微服务,一旦判定为失败节点立即隔离该微服务,SpringCloud直接修改该微服务在Eureka中的状态即可 curl -X PUT http://eurekaserver:port/microservice/xxxxx/status?value=OUT_OF_SERVICE Step2、保存现场,对于OOM类型的错误尤其重要,使用命令包括:jmap、jstack、kill -3等 Step3、告警和处理(...

基于Spring AOP实现对外接口的耗时监控

主要是因为它以横截面的方式插入到主流程中 担心导致主流程代码不够清晰 定位问题不够方便 而在计费二期的项目里需要一个很适合用AOP来做的功能 就是要把对外接口和所调用的外部接口的耗时时间给记录下来 这个需求主要来自于计费一期的联调 常常发生系统间交互不够顺畅的情况 这就需要看每个接口调用时间来判定是谁...

'org.springframework.jdbc.uncategorizedSQLException 'could...

出现这种异常,通常意味着指定类实例化失败,导致相关操作无法继续进行。1. 首先加入hessain.jar包。2. 如果是服务端需要配置web.xml。3. 服务端hessain.-web.xml配置。4. 客户端调用openService。5客户端只要openService的interface。

怎么判定一个maven依赖有没有用

maven 使用groupId和artifactId 作为坐标来确定该项目的标识。比如groupId是org.springframeworkartifactId是spring-core。_庋涂梢匀_aven知道这个jar或者pom所依赖的jar包的位置。version是该项目的版本号。由groupId和artifactId来确定唯一的项目。version决定版本号。??

《荣耀战魂》 中的MotionMatching

- Trajectory Simulation结合Spring Damper On Velocity模型,保证运动预测性和可操控性。- 设定Clamp值使动画和实体运动更为真实,但需平衡与玩法判定的关系。- 时间缩放用于解决动画与实际运动的微小不匹配,滑步问题通过IK解决。通过这些技术和策略,游戏开发者可以实现流畅的游戏体验,同时为游戏设计师提供...

如何才能在面试时对自己的项目有掌握感?

补充:面试官核心关注的是你的项目!你的工作!你的贡献!而非你所在的行业知识、公司情况、实习情况,如果一直在解释你的工作,而非有逻辑有框架地输出具体工作内容,面试官会迅速判定你的水平,然后结束面试~对你失去了好奇心,就没有更多挖掘你能力的机会啦 (公司窗外的风景)📌嘿,这里是...

spring中aop拦截某个方法 spring初始化执行方法 spring两个方法都注解事务 spring销毁方法有什么用 spring的注解有哪些 spring 自定义注解 spring中文 spring ioc spring up
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
信用卡持卡人死亡,名下无遗产,信用卡在生前有欠款,需要家属告知银行持... 学校突发安全事故应急处理出版背景 矿山灾害治理与应急处置技术本书目录 王杰秀编的灾难性事故应急处理手册何时出版并由哪家出版社发行? 股票价格高于内在价值怎么看? 济南路边违章停车的处罚是什么? 里斯本竞技足球俱乐部球队荣誉 里斯本足球俱乐部 140平米装修预算费用多少影响装修预算的因素有哪些 止咳化痰吃什么药好? 管理监狱的是哪个部门 监狱是哪个部门管 Spring aop 报错 aspectj 中xml方式配置after-returning加上returning就出错,不加就不出错,为什么 Spring AOP 的 afterReturing 为什么不能改变返回值 spring的aop在方法执行后怎么得到该方法的参数? spring aop 配置 returning 怎么配置 aop after-returning 和after的区别 Spring AOP中&lt;aop:after-returning&gt;的returning是*什么的返回值 安佳在天猫旗舰店上售卖的牛奶是国内的奶源吗? 安佳儿童牛奶是进口的吗? 安佳牛奶包装上印的是中文标签是指在中国生产的吗? 安佳牛奶自称新西兰进口指的是什么? 安佳牛奶的奶源和产地在哪里? pos机刷卡手续费怎么做账 我是出纳,每次客户要刷卡,但是刷卡实际到账金额是扣除手续费之后,我想问问手续费做账吗?怎么做? 开了发票的货款客户付款扣了手续费,应该怎样做账 刷卡手续费会计分录怎么做 刷卡的手续费怎么记账? 4S店客户刷卡手续费返回怎么入账 监狱归司法局管理吗 监狱现在归法院管吗? Spring的动态代理配置文件怎么配置? 监狱归国家哪个部门管 监狱属于哪个部门 Struts+hibernate怎么配置读写分离 监狱是否属于司法局管理 springMVC 中,servlet filter如何设置在方法执行之后拦截 监狱警察归哪个部门管 什么是文娱部? 中国所有的监狱归哪个部门管 监狱隶属于谁的管辖? 监狱属于司法局管还是属于监狱管理局管辖. 美国的监狱是属于行政还是司法机构管辖? 监狱管理局属于什么单位 请问看守所、监狱、*所(农场)所收纳、关押的是哪些人?他们的职责分别是什么,分别归哪个部门管?谢 足球比赛的英文怎么说 调配派送监狱的权力属于哪个部门? 白湖监狱属于哪部门主管 举行一场足球比赛的英文单词?