为什么@Import引入一个config不能使用这个config中@Bean注解的方法?

@Configuration
public class CDPlayerConfig {

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }
    
    @Bean
    public CDPlayer cdPlay(){
        return new CDPlayer(sgtPeppers());
    }

}

这个是能执行的

@Bean
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

放到另一个配置文件中,然后通过@Import引入

@Configuration
public class CDConfig {
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }
}

引入外部的配置文件

@Configuration
@Import(CDConfig.class)
public class CDPlayerConfig {
 @Bean
    public CDPlayer cdPlay(){
        return new CDPlayer(sgtPeppers());
    }
}

就找不到这个method
图片描述

阅读 5.1k
3 个回答

基本概念错误,sgtPeppers()是调用本类的方法,没有定义当然编译错误,和spring无关。
这么改:

@Configuration
@Import(CDConfig.class)
public class CDPlayerConfig {
 @Bean
    public CDPlayer cdPlay(CompactDisc cd){
        return new CDPlayer(cd);
    }
}

理解有误

可以使用 @Bean @Qualifier配合

新手上路,请多包涵

语法错误
出错的原因是:当前上下文环境下无法访问到该方法(该方法不可见)
没有搞清楚方法的作用域。

  • 首先,在同一个类中所有的filed和method都是可见的(不管被何种访问限制符修饰),且是 直接由名称访问无需前缀
  • 其次,在A类外访问A类成员(filed和method),需要检查:1.访问限制符;2.成员的类型
  • 访问限制符决定了当前上下文环境下是否能够访问到该成员。
  • 成员的类型决定了如何访问该成员:如果该成员是属于 类成员(共有成员,如Static类型) 那么可加上 类名前缀 直接访问。如果属于 类实例成员(每个实例单独拥有) ,则必须通过实例对象前缀来访问。

问题中,sgtPeppers()属于 类实例成员 必须通过 实例对象来访问所以才会出错。
解决办法:

  1. 新建CDConfig 对象并由该对象调用sgtPeppers()方法
  2. 将sgtPeppers()改为类成员(加上static),并由CDConfig 类名访问
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题