gpt4 book ai didi

java - Spring 中基于注释的连接仅适用于集合的一部分

转载 作者:行者123 更新时间:2023-12-01 15:13:16 26 4
gpt4 key购买 nike

我正在开发一个项目,其中预先存在的代码有很多手动设置和在主方法中完成的连接在一起的类 - 似乎是 Spring 擅长替换的完美示例。有多个对象共享一个父类 Widget。每个小部件都包含它所依赖的其他小部件的列表。

举个例子,如果你用代码编写它,它会是这样的:

class Widget{ void addDependency(Widget w}{..}}

class A extends Widget{...}
...
class G extends Widget{...}

A a = new A();
...
G g = new G();

a.addDependency(b);
b.addDependency(c);
b.addDependency(d);
b.addDependency(f);
c.addDependency(g);

您显然不能只拥有 @Autowired 的 Widget 集合,因为那样您将获得所有 Widget 的集合。 @Autowired 有没有办法过滤掉,以便它只获取某些子类型的实例?

有两种我不喜欢的方法。第一种方法是连接所有非 Widget beans,并在加载上下文后将 Widget 集合连接在一起。另一种方法是使用 @Resource 连接到 ApplicationContext 并使用 @PostConstructor 来获取您想要的内容。需要来自ApplicationContext。两者看起来都不优雅,还有其他方法吗?

最佳答案

我可能会像 @Matt 那样做,但我可能会考虑创建一个自定义 BeanPostProcessor但我认为马特的方式更安全。

然后我将创建一个自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Dependencies {
Class<?>[] value();
}

我会将注释放在每个小部件上

@Dependencies({WidgetB.class,WidgetC.class})
public class WidgetA extends Widget {
}

然后,您将进行@Matt bean查找(您应该 checkout Spring's BeanFactoryUtils ),从 bean.getClass().getAnnotation(Dependency.class) 中提取依赖项。

除了注释之外,您还可以在 bean 上添加一个属性来列出依赖项。

关于java - Spring 中基于注释的连接仅适用于集合的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com