springmvc中的cglib
时间: 2024-01-16 11:54:03 浏览: 140
在 Spring MVC 中使用 CGLIB 主要是为了实现动态代理,以便在运行时动态地扩展或修改类的功能。CGLIB 是一个基于 ASM 的字节码生成库,可以在运行时动态生成类的子类,并且可以通过拦截器对方法进行拦截和增强。Spring MVC 中的一些 AOP 功能都是通过 CGLIB 实现的。
在 Spring MVC 中,我们可以使用 @Controller 和 @Service 注解来标注需要被代理的类,然后通过配置文件或注解来启用 AOP 功能,以便动态代理类的方法。CGLIB 还可以用于实现事务管理、缓存管理等功能,提高系统的性能和可扩展性。
相关问题
springmvc中的cglib坐标
如果你想在你的项目中使用 CGLIB,你需要在你的 Maven 或 Gradle 构建文件中添加以下 CGLIB 的依赖:
Maven 坐标:
```xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
```
Gradle 坐标:
```
compile 'cglib:cglib:3.3.0'
```
请注意,CGLIB 比较常用,你也可以在其他构建工具中使用类似的坐标来添加依赖。
springmvc中怎么使用cglib代理计算方法耗时
使用CGLIB代理计算方法耗时的步骤如下:
1. 引入cglib和asm的依赖。
2. 创建一个实现MethodInterceptor接口的拦截器类,重写intercept方法,在方法前后记录时间。
3. 在Controller中定义一个需要计算耗时的方法,并在方法前加上@LogTime注解。
4. 使用AspectJ切面编程,在@Before中获取目标方法并判断是否有@LogTime注解,如果有则使用CGLIB代理该方法并调用,实现计算方法耗时的功能。
示例代码如下:
1. 引入依赖
```
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.1</version>
</dependency>
```
2. 编写拦截器
```
public class TimeInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = proxy.invokeSuper(obj, args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " cost " + (endTime - startTime) + " ms");
return result;
}
}
```
3. 定义需要计算耗时的方法
```
@RestController
public class TestController {
@LogTime
@GetMapping("/test")
public String test() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "test";
}
}
```
4. 编写切面
```
@Aspect
@Component
public class TimeAspect {
@Autowired
private ApplicationContext context;
@Pointcut("@annotation(com.example.demo.annotation.LogTime)")
public void logTime() {
}
@Before("logTime()")
public void beforeLogTime(JoinPoint joinPoint) throws Throwable {
Object target = joinPoint.getTarget();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
if (method.isAnnotationPresent(LogTime.class)) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new TimeInterceptor());
Object proxy = enhancer.create();
Method proxyMethod = proxy.getClass().getMethod(method.getName(), method.getParameterTypes());
proxyMethod.invoke(proxy, joinPoint.getArgs());
}
}
}
```
5. 测试
启动Spring Boot应用,并访问http://localhost:8080/test,可以看到控制台输出以下信息:
```
test cost 1000 ms
```
阅读全文