gpt4 book ai didi

java - 带有条件注释的原型(prototype)作用域 bean

转载 作者:行者123 更新时间:2023-12-02 09:49:10 26 4
gpt4 key购买 nike

我尝试使用可能不同的实现对每个请求重新加载 bean。

在我的 Controller 中,我每次都会从 ApplicationContext 检索 bean:

@Controller
public class LabelsController implements ApplicationContextAware {

private ApplicationContext applicationContext;

@RequestMapping("/...")
public ModelAndView labelConcerns() {
System.out.println("Here I ask for a fresh bean");
InconsistentCaseDetector inconsistentCaseDetector = applicationContext.getBean(InconsistentCaseDetector.class);

InconcientCaseDetector 是一个原始接口(interface)。我有几个实现注释如下(具有不同的条件):

@Component
@Conditional(SkosFormatSelected.class)
@Scope(value = "prototype", proxyMode = ScopedProxyMode.INTERFACES)
public class InconsistentCaseDetectorImpl implements InconsistentCaseDetector {
...

条件示例:

public class SkosFormatSelected implements Condition {

@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
System.out.println("Is skos format selected ?");
return Formats.getCurrent().equals(Formats.SKOS);
}

但是条件类的 matches 方法仅在启动时调用。在启动过程中,会显示日志说明(“是否选择了 skos 格式?”、“是否选择了 xml 格式?”...),然后显示:

org.springframework.context.annotation.ClassPathBeanDefinitionScanner  - Identified candidate component class: file [/home/..../.../WEB-INF/classes/tests/model/vocabulary/skos/algorithm/InconsistentCaseDetectorImpl.class] 

但是,在每次请求时,条件不再执行,并且始终提供相同的实现。以下是运行时日志显示的内容:

Here I ask for a fresh bean
163326 [http-nio-8080-exec-23] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'inconsistentCaseDetectorImpl'
...
163328 [http-nio-8080-exec-23] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'scopedTarget.inconsistentCaseDetectorImpl'
163329 [http-nio-8080-exec-23] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'scopedTarget.inconsistentCaseDetectorImpl'

因此,当我请求该 bean 时,它会从缓存中返回一个实例,而不是创建一个新实例。后来又不知道在哪里,好像新建了一个,仍然没有执行条件子句。

最佳答案

使用

@Autowired
@RequestMapping("/...")
public ModelAndView labelConcerns(final InconsistentCaseDetector inconsistentCaseDetector) {
...
}

应该可以。

顺便说一下,

  1. 您应该将@Component移至接口(interface)(DRY/SRP),也许还有@Scope
  2. 您应该注入(inject) ApplicationContext 而不是使用接口(interface) ApplicationContextAware (DIP)

关于java - 带有条件注释的原型(prototype)作用域 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826857/

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