AspectAnnotation
时间: 2023-08-16 16:30:15 浏览: 44
AspectAnnotation 是一个自定义注解,通常用于标记一个类或方法是一个切面类或切面方法。在使用 Spring AOP 进行面向切面编程时,我们可以通过在切面类上使用 @AspectAnnotation 注解来告诉 Spring 容器这个类是一个切面类,然后在该类的方法上使用其他注解来标记切入点和通知类型。这样 Spring AOP 就能根据注解信息来自动生成代理对象,并在切入点处执行相应的通知逻辑。
相关问题
spring aspect 拦截 annotation
Spring Aspect是一种基于AOP(Aspect-Oriented Programming)的编程模式,它允许我们在应用程序中定义切面(Aspect),并将这些切面应用到特定的方法或类上。在Spring中,可以使用AspectJ注解来定义切面,并使用Spring AOP框架来拦截该注解。
要拦截注解,我们首先需要定义一个切面类,并使用@Aspect注解注释该类。然后,我们可以使用@Pointcut注解定义一个切入点,表示我们要拦截的目标方法或类。该切入点可以定义为匹配特定注解的方法或类。例如,我们可以使用@Pointcut("execution(@com.example.MyAnnotation * *(..))")来表示拦截标记有@MyAnnotation注解的方法。
接下来,我们可以定义一个通知(Advice),用于在目标方法执行之前或之后执行特定的操作。通知可以是@Before(前置通知),@After(后置通知),@AfterReturning(返回通知),@AfterThrowing(异常通知)或@Around(环绕通知)。例如,我们可以使用@Before注解定义一个前置通知方法,它将在目标方法执行之前执行。
最后,我们需要将切面和目标对象进行绑定,以便拦截目标方法。可以使用@Around注解将切面应用于目标方法,并使用@Within注解指定目标类。例如,我们可以使用@Around("@annotation(com.example.MyAnnotation) && within(com.example.MyClass)")来表示将切面应用于带有@MyAnnotation注解的MyClass类中的方法。
总而言之,通过使用Spring Aspect和AspectJ注解,我们可以轻松地拦截注解,并在目标方法执行前后执行自定义操作。这为我们提供了一种简洁而强大的方式来实现面向切面的编程,并为应用程序添加横切关注点。
spring boot Aspect
Spring Boot Aspect是Spring框架中的一个模块,它提供了一种面向切面编程的方式,可以在不修改原有代码的情况下,对系统进行功能增强或横切关注点的处理。下面是一个简单的Spring Boot Aspect的例子:
1.首先,在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
2.创建一个自定义注解@SysLog,用于标记需要记录日志的方法:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SysLog {
String value() default "";
}
```
3.创建一个切面类,用于处理@SysLog注解:
```java
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.space.aspect.anno.SysLog)")
public void logPointCut() {}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
// 执行方法
Object result = point.proceed();
// 执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
// 保存日志
saveSysLog(point, time);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLog sysLog = new SysLog();
SysLogAnnotation syslogAnnotation = method.getAnnotation(SysLogAnnotation.class);
if (syslogAnnotation != null) {
// 注解上的描述
sysLog.setOperation(syslogAnnotation.value());
}
// 请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
// 请求的参数
Object[] args = joinPoint.getArgs();
try {
String params = new Gson().toJson(args);
sysLog.setParams(params);
} catch (Exception e) {
e.printStackTrace();
}
// 获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
// 设置IP地址
sysLog.setIp(IPUtils.getIpAddr(request));
// 用户名
String username = ((SysUser) SecurityUtils.getSubject().getPrincipal()).getUsername();
sysLog.setUsername(username);
sysLog.setTime(time);
sysLog.setCreateTime(new Date());
// 保存系统日志
sysLogService.save(sysLog);
}
}
```
4.在Controller中使用@SysLog注解:
```java
@RestController
public class TestController {
@SysLog("测试")
@GetMapping("/test")
public String test(@RequestParam("name") String name){
return name;
}
}
```
在上面的例子中,我们使用了@SysLog注解来标记需要记录日志的方法,在SysLogAspect切面类中,我们使用@Around注解来处理@SysLog注解,并在方法执行前后进行日志记录。同时,我们还可以通过切面类获取方法的参数、返回值、执行时间等信息,从而实现更加灵活的功能增强。