Springboot源码分析之EnableAspectJAutoProxy

Spring框架中的AOP(Aspect Oriented Programming)模块是实现切面编程的核心模块,而EnableAspectJAutoProxy就是Spring框架中一个非常重要的注解,它被用于启用Spring容器中的AOP机制。

下面,我们来详细介绍一下EnableAspectJAutoProxy的源码分析、使用方法和案例说明。

一、EnableAspectJAutoProxy的源码分析

我们首先来看一下EnableAspectJAutoProxy的源码:

```java

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Import({AspectJAutoProxyRegistrar.class})

public @interface EnableAspectJAutoProxy {

boolean proxyTargetClass() default false;

boolean exposeProxy() default false;

}

```

从上面的代码可以看出,EnableAspectJAutoProxy是一个注解,它定义了两个属性:

1. proxyTargetClass属性

- 该属性的默认值为false,表示默认不使用CGLIB代理,即不使用子类来进行代理,如果取值为true,则代表使用CGLIB代理。

2. exposeProxy属性

- 该属性的默认值为false,表示Spring容器不会在AOP代理中暴露代理对象,如果取值为true,则代表Spring容器允许在AOP代理中暴露该对象。

另外,从代码中也可以看出,EnableAspectJAutoProxy使用了@Import注解,它引入了一个AspectJAutoProxyRegistrar类,该类是实现EnableAspectJAutoProxy功能的关键所在。

二、EnableAspectJAutoProxy的使用方法

在Springboot的应用程序中,我们需要在应用程序主类上打上@EnableAspectJAutoProxy注解,从而开启AOP代理。

```java

@SpringBootApplication

@EnableAspectJAutoProxy

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

```

除了在应用程序主类上打上@EnableAspectJAutoProxy注解,我们还需要在切面类上添加@Aspect注解,从而告诉Spring容器该类是一个切面类。

```java

@Aspect

@Component

public class TimeInterceptor {

@Around("execution(* com.example.demo.controller.*.*(..))")

public Object handleMethod(ProceedingJoinPoint pjp) throws Throwable {

// do something before advice

Object result = pjp.proceed();

// do something after advice

return result;

}

}

```

在上面的代码片段中,我们定义了一个切面类TimeInterceptor,它使用了@Aspect注解,并且在该类的handleMethod方法上定义了一个环绕通知。

同时,在定义切面类时,我们需要在@EnableAspectJAutoProxy注解中进行一些配置,例如proxyTargetClass属性和exposeProxy属性的相关配置,具体配置如下:

```java

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

public class AppConfig {

@Bean

public TimeInterceptor getTimeInterceptor() {

return new TimeInterceptor();

}

}

```

三、EnableAspectJAutoProxy的案例说明

下面,我们通过一个简单的案例来说明@EnableAspectJAutoProxy的使用。

1. 创建一个Springboot的应用程序

创建一个空的Springboot应用程序,并在pom.xml文件中添加以下依赖:

```xml

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-aop

```

2. 编写切面代码

创建一个切面类,在该类上使用@Aspect注解,然后编写一个环绕通知,用于计算程序处理时间。

```java

@Aspect

@Component

public class TimeInterceptor {

@Around("execution(* com.example.demo.controller.*.*(..))")

public Object handleMethod(ProceedingJoinPoint pjp) throws Throwable {

long startTime = System.currentTimeMillis();

Object result = pjp.proceed();

long endTime = System.currentTimeMillis();

System.out.println(pjp.getSignature().toShortString() + " time: " + (endTime - startTime) + " ms");

return result;

}

}

```

上面的代码使用了@Around注解,表示该方法是一个环绕通知,并且针对com.example.demo.controller包下的所有方法进行增强。

3. 在主类上引入@EnableAspectJAutoProxy注解

在应用程序主类上打上@EnableAspectJAutoProxy注解开启AOP代理。

```java

@SpringBootApplication

@EnableAspectJAutoProxy

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

```

4. 编写Controller代码

在Controller类中加入一些简单的代码,观察AOP代理是否生效。

```java

@RestController

@RequestMapping(value = "/hello")

public class HelloController {

@GetMapping(value = "/world")

public String hello() {

return "Hello World!";

}

}

```

5. 运行项目

启动应用程序,访问http://localhost:8080/hello/world,可以看到在控制台输出了类似下面的日志:

```

com.example.demo.controller.HelloController.hello() time: 6 ms

```

从上面的日志中可以看到,在访问Controller方法时,我们编写的AOP代理代码确实生效了,并且计算了程序的处理时间。

总结:

通过上面的分析,我们可以看到@EnableAspectJAutoProxy注解在Springboot框架中的使用方法和作用,同时,在实际使用时,需要注意@EnableAspectJAutoProxy注解中的proxyTargetClass属性和exposeProxy属性的配置,不同的配置会对实际代码产生影响。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(74) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部