Spring框架NoSuchBeanDefinitionException异常求助:找不到名为'college'的Bean
排查与解决Spring中"No bean named 'college' available"异常
问题原因分析
从你的代码和异常信息来看,主要有三个核心问题导致找不到名为college的Bean:
- 内部配置类的访问权限问题:你的
Config类是College类的默认权限内部类(没有public修饰),Spring的AnnotationConfigApplicationContext无法正常访问并加载这个配置类,导致配置里的@Bean定义完全没生效。 - 组件扫描未配置:你通过
AnnotationConfigApplicationContext(Config.class)启动容器时,Spring只会处理这个配置类里的@Bean方法,不会自动扫描带有@Component注解的类(比如你的College类),所以@Component("college")定义的Bean根本没被注册到容器中。 - Bean命名不匹配:就算
Config类能被加载,你在Config里的@Bean方法是name(),默认生成的Bean名字是name,不是你要获取的college,这也会导致找不到对应名称的Bean。
解决方法
我们可以分两种方式来修复,选一种适合你的即可:
方式一:修复配置类并启用组件扫描
- 调整Config类的结构与权限:把
Config类改成public的顶级类(不要嵌套在College里),或者给内部的Config加上public修饰符(更推荐顶级类,避免不必要的访问问题)。 - 在Config类上添加组件扫描注解:让Spring能扫描到
@Component标注的College类。 - (可选)统一Bean命名:如果想通过
@Bean定义College,确保Bean名字是college。
修改后的代码示例:
// College.java package com.annotations.annotations; import org.springframework.stereotype.Component; @Component("college") public class College { public void id() { System.out.println("33"); } } // Config.java(顶级类,public) package com.annotations.annotations; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "com.annotations.annotations") // 扫描当前包下的组件 public class Config { // 可选:如果需要通过@Bean定义,指定name为"college" // @Bean("college") // public College collegeBean() { // return new College(); // } } // App.java package com.annotations.annotations; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class App { public static void main(String[] args) { ApplicationContext mech = new AnnotationConfigApplicationContext(Config.class); College lokesh = mech.getBean("college", College.class); lokesh.id(); } }
方式二:直接通过@Bean定义并指定正确的Bean名称
如果你不想用@Component,只想通过@Bean来注册Bean,那只需要:
- 把
Config改成可访问的public类(顶级类或public内部类)。 - 在
@Bean注解里指定名称为college。
修改后的核心代码:
// Config.java(public顶级类) @Configuration public class Config { @Bean("college") // 指定Bean名称为college public College college() { return new College(); } } // College.java可以去掉@Component注解 public class College { public void id() { System.out.println("33"); } }
验证效果
不管用哪种方式,运行App类后,Spring容器都会成功注册名为college的Bean,调用id()方法会输出33,异常也就解决了。
内容的提问来源于stack exchange,提问作者Lokesh Naidu
相关产品推荐
相关产品推荐

