diff --git a/src/main/java/com/imyeyu/inject/BeanScanner.java b/src/main/java/com/imyeyu/inject/BeanScanner.java index 53235c2..ed472b6 100644 --- a/src/main/java/com/imyeyu/inject/BeanScanner.java +++ b/src/main/java/com/imyeyu/inject/BeanScanner.java @@ -253,22 +253,37 @@ public class BeanScanner { } private List findPostConstructs(Class clazz) { - List methods = new ArrayList<>(); + // 收集所有 @PostConstruct 方法及其元数据(继承深度、order 值) + record PostConstructInfo(Method method, int depth, int order) {} + List collected = new ArrayList<>(); Class currentClass = clazz; + int depth = 0; // 从当前类向上遍历到 Object,收集所有 @PostConstruct 方法 while (currentClass != null && currentClass != Object.class) { + int currentDepth = depth; for (Method method : currentClass.getDeclaredMethods()) { if (method.isAnnotationPresent(PostConstruct.class)) { if (method.getParameterCount() != 0) { throw new InjectException("@PostConstruct method must have no parameters: %s".formatted(method.getName())); } - // 添加到列表头部,确保父类方法先执行 - methods.addFirst(method); + int order = method.getAnnotation(PostConstruct.class).value(); + collected.add(new PostConstructInfo(method, currentDepth, order)); } } currentClass = currentClass.getSuperclass(); + depth++; } - return methods; + + // 先按继承深度降序(父类深度大,先执行),同层级内按 order 升序 + collected.sort((a, b) -> { + int depthCompare = Integer.compare(b.depth, a.depth); + if (depthCompare != 0) { + return depthCompare; + } + return Integer.compare(a.order, b.order); + }); + + return collected.stream().map(PostConstructInfo::method).toList(); } } diff --git a/src/main/java/com/imyeyu/inject/annotation/PostConstruct.java b/src/main/java/com/imyeyu/inject/annotation/PostConstruct.java index b608e64..058ab3d 100644 --- a/src/main/java/com/imyeyu/inject/annotation/PostConstruct.java +++ b/src/main/java/com/imyeyu/inject/annotation/PostConstruct.java @@ -13,4 +13,11 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PostConstruct { + + /** + * 执行顺序,数值越小越先执行,默认为 0 + * + * @return 执行顺序 + */ + int value() default 0; } diff --git a/src/main/java/com/imyeyu/inject/annotation/Qualifier.java b/src/main/java/com/imyeyu/inject/annotation/Qualifier.java index 22a4f50..e6ae878 100644 --- a/src/main/java/com/imyeyu/inject/annotation/Qualifier.java +++ b/src/main/java/com/imyeyu/inject/annotation/Qualifier.java @@ -10,7 +10,7 @@ import java.lang.annotation.Target; * * @author 夜雨 */ -@Target(ElementType.PARAMETER) +@Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Qualifier {