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
```
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/
发表评论 取消回复