Micronaut 不只是 DI 走编译期路线,AOP 也一样。
你可以把 AOP 理解成:
给某类任务统一套上巡逻规则。
比如:
- 事务
- 重试
- 日志
- 限流
- 缓存
- 安全拦截
在很多传统框架里,这类切面能力往往和运行时代理、反射、动态增强强绑定。
Micronaut 的特点是:
很多 AOP 所需元信息也尽量在编译期生成。
例如一个切面注解:
package example;
import io.micronaut.aop.Around;
import jakarta.inject.Singleton;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Around
public @interface ScoutLog {
}拦截器:
package example;
import io.micronaut.aop.MethodInterceptor;
import io.micronaut.aop.MethodInvocationContext;
import jakarta.inject.Singleton;
@Singleton
public class ScoutLogInterceptor implements MethodInterceptor<Object, Object> {
@Override
public Object intercept(MethodInvocationContext<Object, Object> context) {
long start = System.currentTimeMillis();
try {
return context.proceed();
} finally {
long cost = System.currentTimeMillis() - start;
System.out.println(context.getMethodName() + " cost=" + cost + "ms");
}
}
}业务方法:
package example;
import jakarta.inject.Singleton;
@Singleton
public class PermitService {
@ScoutLog
public String approve(String permitId) {
return "approved:" + permitId;
}
}这套机制的类比很直白:
巡逻规则不是临时通知,而是早就写进了任务手册。
所以 Micronaut 的 AOP 不只是“也能做切面”。
它的关键在于:
切面能力和轻量运行时并不冲突。