1. 怎样获取spring Aop 中拦截到的参数
这个得用注解吧,我也没试过。不过注解应该能解决问题,类似于spring mvc中的用法。
2. spring的aop在方法执行后怎么得到该方法的参数
afterReturning重写方法里面就把方法的参数,当作形参传递给arg2了
public class After implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
}
}
3. AOP时,如何获取目标方法上的注解
private void beforeTransationHandle(JoinPoint point) throws Exception{
//拦截的实体类
Object target = point.getTarget();
//拦截的方法名称
String methodName = point.getSignature().getName();
//拦截的方法参数
Object[] args = point.getArgs();
//拦截的放参数类型
Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();
Method m = null;
try {
//通过反射获得拦截的method
m = target.getClass().getMethod(methodName, parameterTypes);
//如果是桥则要获得实际拦截的method
if(m.isBridge()){
for(int i = 0; i < args.length; i++){
//获得泛型类型
Class genClazz = GenericsUtils.getSuperClassGenricType(target.getClass());
//根据实际参数类型替换parameterType中的类型
if(args[i].getClass().isAssignableFrom(genClazz)){
parameterTypes[i] = genClazz;
}
}
//获得parameterType参数类型的方法
m = target.getClass().getMethod(methodName, parameterTypes);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
4. spring的aop怎么获取切点参数
比较简单的方式可以用JoinPoint举个列子。
package com.jf.my.Demo.AOP;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TestAOPDemoTwo {
@Pointcut("execution(* *.run*(..)) ")
public void any() {
}
@Before(value = "any()")
public void before(JoinPoint join) {
System.out.println("Method 2 before===========");
}
@After(value = "any()")
public void after(JoinPoint join) {
System.out.println("Method 2 after============");
}
@AfterReturning(value = "any()",returning="ji")
public void around(String ji) {// ProceedingJoinPoint pjp
System.out.println("ji");
System.out.println("retrun"+ji);
}
}
直接在方法里写joinpoint,spring会自己注入的,你可以去查查joinpoint的用法之类的东西,然后用下就好了。https://my.oschina.net/itblog/blog/211693这里面介绍的挺不错的
5. 什么是aop
AOP为Aspect Oriented Programming的缩写,是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
AOP的出现弥补了OOP的这点不足,AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,AOP是基于动态代理模式。AOP是方法级别的,要测试的方法不能为static修饰,因为接口中不能存在静态方法,编译就会报错。
AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
(5)如何找到aop目标方法的参数扩展阅读
AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ。而动态代理则以Spring AOP为代表,静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。
静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象;动态代理则不会修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
6. aop怎么获取springmvc controller中的requestmapping
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView myMethod(HttpServletRequest request,
HttpServletResponse response,
//@RequestParam("username")String username, @RequestParam("password")String password
String username,String password,//如果和前台的一样一样简写成这样
ModelMap modelMap) throws Exception {
username = new String(username.getBytes("iso8859-1"),"UTF-8");//编码问题 (服务器一帮都是iso的)
System.out.println(username+":"+password);
modelMap.put("loginUser", username);
modelMap.put("msg", "I'm in session");
return new ModelAndView("/view/hello", modelMap);
}
这里是一个方法,springMVC中参数可以直接现在方法的参数列表中,如果是对象属性的话也可以直接使用对象例如(User user,...)
刚才的方法对应的前台:
<form action="login">
username:
<input name="username" />
<br>
password:
<input name="password" type="password" />
<br>
<input type="submit" value="登入" />
</form>
追问
我的form表单中有10多个字段 而且和数据库都是一一对应的,而且以后说不定还会增加,不想一个字段一个字段的传,想直接将整个form表单的所有字段全传过去 该怎么写啊
回答
这些数据都是一个类里面的吧。就只要吧原来的string username,string password ...
改成哪个类就行了,会自动封装进去的例如:方法的参数User user,HttpRequest requrst,..
使用的时候只要user.getUsername();
类似下面的:
@RequestMapping("/addUser")
public String addUser(User user,HttpServletRequest request){
userManager.addUser(user);
return "redirect:/user/getAllUser";
}
7. Spring aop 注解方式怎么获得执行了目标的某个方法
private void beforeTransationHandle(JoinPoint point) throws Exception{
//拦截的实体类
Object target = point.getTarget();
//拦截的方法名称
String methodName = point.getSignature().getName();
//拦截的方法参数
Object[] args = point.getArgs();
//拦截的放参数类型
Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();
Method m = null;
try {
//通过反射获得拦截的method
m = target.getClass().getMethod(methodName, parameterTypes);
//如果是桥则要获得实际拦截的method
if(m.isBridge()){
for(int i = 0; i < args.length; i++){
//获得泛型类型
Class genClazz = GenericsUtils.getSuperClassGenricType(target.getClass());
//根据实际参数类型替换parameterType中的类型
if(args[i].getClass().isAssignableFrom(genClazz)){
parameterTypes[i] = genClazz;
}
}
//获得parameterType参数类型的方法
m = target.getClass().getMethod(methodName, parameterTypes);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
8. spring 中的aopbefore执行的方法的参数是基本的数据类型该怎么定义
@Component
public class TestInterceptor {
@Pointcut("execution (* com.test.facade.*.*(..))")
public void testPointcut(){}
@Around("testPointcut()")
public Object testHandleBody(ProceedingJoinPoint pjp) throws Throwable{
Object retVal = null; //连接点方法返回值
//获取将要执行的方法名称
String methodName = pjp.getSignature().getName();
//获取执行方法的参数
Object[] args = pjp.getArgs();
9. spring aop后置通知怎么获取目标方法返回值,及通知的信息
访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:Object[]getArgs:返回目标方法的参数SignaturegetSignature:返回目标方法的签名ObjectgetTarget:返回被织入增强处理的目标对象ObjectgetThis:返回AOP框架为目标对象生成的代理对象注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。