今天刚学习spring的AOP切面。就试了试CGlib实现的动态代理,看看效果,代码写的很简单。
我使用的全注解,所以没有配置xml。
奇怪的是:将切入点的返回值类型设置成Integer可以返回正确的值,但是增强的方法好像没有被执行
以下是根据您提供的信息进行的代码补全和修正。请按照您的实际项目结构和需要进行适当调整。
首先,创建一个简单的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类时,您应该能够看到代理方法和切面的输出,以及目标方法的返回值。这里只是一个简单的示例,实际项目中可能会有更多的配置和处理。希望这些代码对您有所帮助!