【问题标题】:Spring Boot cannot autowired component with abstract and interfaceSpring Boot 无法使用抽象和接口自动装配组件
【发布时间】:2018-12-03 20:09:55
【问题描述】:

在我的 Spring Boot 2.0.2 应用程序中,我试图注入一个继承自抽象类的组件,该类实现了一个接口,但它不起作用。

代码:

组件摘要:(我需要放@Component吗?)

package app.project.service;

@Component
public abstract class AbstractStepService implements IStepService {

    protected final void addTask() {
        ...
    }

    @Override
    public StepDataDto launch() throws StepException {
        ...
    }
}

界面:

package app.project.service;

public interface IStepService  {
    StepDataDto launch() throws StepException;
}

package app.project.service;

组件:

@Component
public class CStepServiceImpl extends AbstractStepService implements IStepService {

    @PostConstruct
    private void defineTasks() {
    }
}

package app.project.service;

Junit 测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CStepServiceTest {

    @Autowired
    @Qualifier("cStepServiceImpl")
    private IStepService service;

}

package app.project;

应用:

@SpringBootApplication
@ComponentScan(basePackages ={"app.project.service"})
public class MyApplication {}

启动我的 Junit 测试时出现错误消息:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'app.project.service.IStepService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=cStepServiceImpl)}

有什么想法吗?

谢谢

【问题讨论】:

    标签: spring spring-boot junit autowired


    【解决方案1】:

    像这样更改你的声明

    @Autowired
    @Qualifier("CStepServiceImpl")
    private IStepService service;
    

    @Autowired
    private IStepService CStepServiceImpl;  
    

    应该可以。 spring 自动创建的 bean 名称具有 CStepServiceImpl 名称。

    你也可以这样命名你的 bean

    @Component(value = "myName")
    public class CStepServiceImpl extends AbstractStepService implements IStepService {
    
    }
    

    并在自动装配期间使用 myName。

    【讨论】:

    • 非常感谢!我虽然该限定符的名称需要以小写字符开头......我还要补充一点:抽象类不需要用 @Component 注释(无法实例化)。
    • 是的。抽象类不需要@Component。在大多数情况下,生成的 bean 名称将遵循驼峰命名结构。但是在某些情况下(例如您的类名开头有两个大写字母),生成的名称是不同的。如果您将类命名为 CstepServiceImpl,那么它将生成 bean 名称为 cstepServiceImpl。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2019-01-10
    • 2018-12-27
    相关资源
    最近更新 更多