当前位置: 首页 > 知识库问答 >
问题:

在扩展的类中,spring bean为空

井轶
2023-03-14

我已经用很多方法搜索了这个,但是找不到任何与它相关的东西。我有一个问题,在另一个bean(扩展)中没有spring bean是自动连线的。

我有的是这样的:

interface A {
}

@Service
class B implements A {
    @Autowired
    private RandomSpringBean randomSpringBean;
}

@Primary
@Service
class C extends B {
    
}

正在发生的是,B内部的RandomSpringBean在被另一个自动连接B的类调用时没有被自动连接,而只是被自动连接C的类调用,如下所示:

class D {
    @Autowired
    private B b;//beans inside B are null
}

class E {
    @Autowired
    private C c;//beans inside B (C subclass) are not null
}

D和E都在其他类内部被自动连接。如果我注释掉/移除C,B就会恢复正常工作。

我希望那不会太混乱。

PS:不是我这样干的,是别人干的。我只是有这个问题,想知道一个方法来解决它,也许不让C停止扩展B。

共有1个答案

郑卜鹰
2023-03-14

如果您没有使用@qualifier/@primary或类似的结构,则这部分代码会给您带来问题:

class D {
     @Autowired
     private B b;
}

例外情况类似于:

Field b in my.boring.package.beandemo.D required a single bean, but 2 were found:

下面是一个工作演示:

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
public class MyBeans {
    
    @Component
    public static class RandomBean {}
    
    public static interface A {}
    
    @Component("B")
    public static class B implements A {
        
        @Autowired
        RandomBean randomBean;
    }
    
    @Component
    public static class C extends B {}
    
    @Component
    public static class D {
        
        @Autowired
        @Qualifier("B")
        private B b;
        
        @PostConstruct
        public void checkRandomBean() {
            if (b.randomBean != null) {
                System.out.println("B has randomBean");
            }
        }
    }
    
    @Component
    public static class E {
        
        @Autowired
        private C c;
        
        @PostConstruct
        public void checkRandomBean() {
            if (c.randomBean != null) {
                System.out.println("C has randomBean");
            }
        }
    }
}

编辑:

请检查D中B的运行时类。

因为C是用@primary注释的,所以C的实例应该注入到D。

此外,C将不能访问B的私有字段。

 类似资料:
  • 问题内容: 我对大概要文件节具有通用逻辑,因此我尝试使用对概要文件节的通用逻辑进行创建,并且与该节相关的所有类都应按照我的理解正确扩展此Profile类,但是当我尝试创建时会收到错误消息: CodeIgniter尝试找到我正在其中运行的此类。 我的错误在哪里?或者,也许还有另一种更好的方法来标记出通用逻辑? 问题答案: 我认为您已经将MY_Controller放在/ application / c

  • Szenario:我有两个扩展,它们用一些特定字段扩展了。在TYPO3 9之前,我必须使用以下打字脚本配置对新闻扩展的依赖关系进行配置: 模型扩展了基本扩展的模型: 在TYPO3 10中,在(中断:#87623): 只要您只有一个扩展新闻扩展名的扩展名,它就可以工作多久。如果您有第二个扩展并启用TYPO3缓存,您将得到一个错误,即在第一个扩展中添加的字段在新闻扩展的模板中不可用。奇怪的是,这个问题

  • 这是我现在面临的问题。我有一个类,假设 ,这个类定义了一个名为 的方法,该方法返回一个 实例。类 在 内部定义,并被声明为。我想做的是定义一个扩展的类,但我也我自己的功能(方法,属性等)来扩展。我也希望返回。 问题是< code>Bar是最终的。下面是我想做的一个例子: 我想做的是: 我怎样才能做到这一点? [编辑]我正在为我的问题添加更多详细信息。我实际上正在为 Jenkins 开发一个插件,搜

  • 问题内容: 我有一个基类,我想在服务中进行扩展以帮助将数据输入角度范围。我已经在网上搜索了一种解决方案,但是没有找到我喜欢的解决方案。我有一个用于访问设备文件系统的基类 类结构: 我希望能够在几个不同的角度服务(即offlineCart,offlineCustomLists等)中扩展该类,其中每个服务都将能够使用存储库来存储各种不同的数据类型。我正在寻找最好,最合适的方式来做到这一点。在普通Jav

  • 数据类似乎是Java中老式POJO的替代品。这些类将允许继承是可以预期的,但我看不到扩展数据类的方便方法。我需要的是这样的东西:

  • 验证码生成 缓存支持