1. @PostConstruct
@PostConstruct 是一个Java注解,它用于指示一个方法应在其所在的类初始化之后立即执行。通常将它用于在依赖注入完成后执行一些初始化工作或设置。当容器创建一个带有 @PostConstruct 注解的 bean 时,将会在依赖注入完成后立即调用带有该注解的方法。
例如,在一个使用Spring框架的应用中,可以使用 @PostConstruct 注解来标记一个方法作为初始化方法,以便在依赖注入完成后执行一些设置操作,如初始化某些属性或建立数据库连接。
下面是一个使用 @PostConstruct 注解的示例:
@Component
public class MyBean {
private String message;
@PostConstruct
public void init() {
message = "Hello, World!";
// 执行其他初始化操作
}
// 其他方法和属性
}
在上面的例子中,当容器创建 MyBean 实例并完成依赖注入后,将调用带有 @PostConstruct 注解的 init() 方法,从而设置 message 属性并执行其他初始化操作。
参考:SpringBoot @PostConstruct和@PreDestroy使用详解
2. @Pointcut
@Pointcut
是一个在Spring AOP(面向切面编程)中使用的注解。它用于定义切入点,即在程序执行过程中需要进行横切的方法或代码片段的位置。切入点声明了哪些方法可以被AOP代理捕获和处理。
使用@Pointcut
注解可以将切入点表达式与切入点命名绑定在一起。切入点表达式是一个规则,用于匹配程序中的特定方法。通过指定切入点表达式,开发人员可以定义需要拦截、增强或修改的方法。
示例:
@Pointcut("execution(* com.example.service.*.*(..))")
public void myPointcut() {}
上述示例将myPointcut()
定义为一个切入点,它匹配com.example.service包中的所有方法。
通过使用@Pointcut注解,开发人员可以更方便地管理切入点,并在需要的地方进行引用,以便将横切逻辑应用到程序的特定位置。
2.1 @Pointcut使用例子
当使用Spring AOP时,我们可以将@Pointcut注解用于定义一个切入点表达式,然后在通知(Advice)中引用该切入点。下面是一个示例:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void myPointcut() {}
@Before("myPointcut()")
public void beforeMethod() {
System.out.println("前置通知:在方法执行之前执行");
}
// 其他通知方法...
}
上述示例中,我们定义了一个名为myPointcut()
的切入点,它匹配了com.example.service
包中的所有方法。然后,我们可以在通知方法(比如beforeMethod()
)上使用切入点表达式来指定将这个通知应用到哪些方法上。
在上面的示例中,beforeMethod()
方法使用了@Before
注解,该注解表示该方法是一个前置通知,在切入点匹配的方法执行之前执行。@Before("myPointcut()")
中的myPointcut()
引用了我们之前定义的切入点。
通过这样的方式,我们可以将通知应用到特定的方法上,实现横切关注点的逻辑。在此示例中,我们在每个匹配的方法执行之前打印一条消息作为前置通知。
3. @annotation 注解的作用
4.@Aspect注解
5. @Around
在Java中,@Around
注解用于在方法执行前后执行额外的逻辑。它是Spring框架中的一个切面注解,用于声明一个方法或者类是一个切面。
使用 @Around
注解的方法将会在目标方法执行前后运行。该方法可以拥有一个 ProceedingJoinPoint
参数,通过调用 proceed()
方法来实际执行目标方法。可以通过在 @Around
注解的方法中编写额外的代码,例如记录日志、处理异常、追踪方法执行时间等。
下面是一个示例代码,演示了使用 @Around
注解的方法:
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.myapp.service.*.*(..))")
public Object logMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
long executionTime = endTime - startTime;
System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
return result;
}
}
在上述示例中,logMethodExecutionTime
方法使用了 @Around
注解,它会在 com.example.myapp.service
包下的所有方法执行前后记录方法的执行时间。
总的来说,@Around
注解可以用于在方法执行前后执行一些通用的逻辑,从而实现一些横切关注点的功能。在Spring框架中,切面通常被用于处理日志、事务管理、安全性检查等方面。
// TODO