首页 新闻 会员 周边

通过cglib动态代理获取的代理类返回值为空。

0
悬赏园豆:20 [待解决问题]

今天刚学习spring的AOP切面。就试了试CGlib实现的动态代理,看看效果,代码写的很简单。
我使用的全注解,所以没有配置xml。

  • 首先是被代理的目标类
  • 切面类
  • 测试和测试结果

奇怪的是:将切入点的返回值类型设置成Integer可以返回正确的值,但是增强的方法好像没有被执行

rightCoder的主页 rightCoder | 初学一级 | 园豆:182
提问于:2023-03-29 16:01
< >
分享
所有回答(1)
0

以下是根据您提供的信息进行的代码补全和修正。请按照您的实际项目结构和需要进行适当调整。

首先,创建一个简单的User类作为实体对象:
package com.CGlib.pojo;

public class User {
private int id;
private String username;
private String password;

// Getters and setters
// ...

}
接下来是被代理的目标类UserService:
package com.CGlib.impl;

import com.CGlib.pojo.User;
import org.springframework.stereotype.Service;

@Service("userService1")
public class UserService {
public Integer insertUser(User user) {
System.out.println("添加用户中...");
return 1;
}
}
然后是切面类CGLibAspect:
package com.CGlib.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class CGLibAspect {

@Pointcut("execution(* com.CGlib.impl.UserService.insertUser(com.CGlib.pojo.User))")
public void pointcut() {}

@Before("pointcut()")
public void before() {
    System.out.println("前置通知");
}

@Around("pointcut()")
public void around(ProceedingJoinPoint joinPoint) {
    String methodName = joinPoint.getSignature().getName();
    String args = joinPoint.getArgs().toString();
    try {
        System.out.println("检查用户是否存在。");
        System.out.println("检查没有,执行添加");
        joinPoint.proceed();
        System.out.println("添加成功,并返回了1");
    } catch (Throwable throwable) {
        throwable.printStackTrace();
        System.out.println("有异常");
    } finally {
        System.out.println("本次操作完毕。");
    }
}

}
创建一个配置类CGLibConfig来启用Aspect:
package com.CGlib.config;

import com.CGlib.aspect.CGLibAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.CGlib.impl")
public class CGLibConfig {

@Bean
public CGLibAspect aspect() {
    return new CGLibAspect();
}

}
最后是测试类CGlibTest:
package com.CGlib.test;

import com.CGlib.config.CGLibConfig;
import com.CGlib.impl.UserService;
import com.CGlib.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class CGlibTest {
public static void main(String[] args) {
insertUserXML();
insertUser();
}

public static void insertUserXML() {
    ApplicationContext context = new AnnotationConfigApplicationContext(CGLibConfig.class);
    UserService userService1 = context.getBean("userService1", UserService.class);
    User user = new User();
    user.setId(1001);
    user.setPassword("123456");
    user.setUsername("张三");
    Integer result = userService1.insertUser(user);
    System.out.println("返回结果:" + result);
}

public static void insertUser() {
    ApplicationContext context = new AnnotationConfigApplicationContext(CGLibConfig.class);
    UserService userService1 = context.getBean("userService1", UserService.class);
    User user = new User();
    user.setId(1601);
    user.setPassword("123456");
    user.setUsername("李四");
    Integer result = userService1.insertUser(user);
    System.out.println("返回结果:" + result);
}

}
请确保所有类文件都放在正确的包路径下,并使用合适的依赖项。在运行CGlibTest类时,您应该能够看到代理方法和切面的输出,以及目标方法的返回值。这里只是一个简单的示例,实际项目中可能会有更多的配置和处理。希望这些代码对您有所帮助!

小九九呀 | 园豆:383 (菜鸟二级) | 2023-07-22 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册