gpt4 book ai didi

java - 可定制的@Autowired

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:34 24 4
gpt4 key购买 nike

假设我有一个像这样的带注释的 bean 属性 setter :

public class Foo {
...
@Autowired
public void setBar(Bar bar) {
...
}

Springframework 将像往常一样查找匹配的 Bar 属性。但是,我想拦截默认的 bean 解析过程并自己添加一点“魔法”。我想介绍这样的解析器:

public interface SomeResolverInterface<T> {
public T resolve(Class<T> beanClass);
}

public class BarResolver implements SomeResolverInterface<Bar> {

@Override
public Bar resolve(Class<Bar> beanClass) {
if(someCondition) {
return someBean;
} else {
return anotherBean;
}
}

...

我知道我总是可以引入某种包装器 bean 并将解析逻辑移入其中,但我更喜欢使用如上所述的解析器的更通用的方法来使 Foo 完全独立于解析逻辑。

在 Springframework 中有没有办法实现这样的事情?

最佳答案

根据您的描述,您似乎只需要在启动时执行额外的逻辑( Autowiring )。有几种方法可以解决这个问题(从最坏到最好):

  • AOP - 坏主意,通过拦截每次调用引入运行时开销

  • 自定义范围 - 参见:Custom spring scopes?也在运行时工作,也是一个坏主意

  • @Profile - 定义两个匹配的 beans 并根据 Activity 配置文件仅启用一个。非常干净,仅在启动时引入开销

  • @Configuration - 在 Java 中定义 bean 有一个额外的好处,即可以完全控制它们的创建方式:


@Configuration
public class Config {

@Autowired
private Bar someBean;

@Autowired
private Bar anotherBean;

@Bean
@Primary
public Bar primaryBean() {
if(someCondition) {
return someBean;
} else {
return anotherBean;
}
}

}

正如您在本例中看到的,我们有三个 Bar 类型的 bean:someBeananotherBeanprimaryBean。前两个也可以使用 @Bean 或使用 @Service 通过组件扫描进行配置。但是为了使 Autowiring 成为可能,最后一个 primaryBean 被标记为 @Primary。这样,它将优于其他两个。

这是我推荐的解决方案,因为解析逻辑清晰、可维护且可读。恕我直言,这是基于 Java 的 @Configuration 真正闪耀的地方。

关于java - 可定制的@Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511818/

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