java - Spring Framework 5 简单 bean 示例 - 为什么出现 NoSuchBeanDefinitionException
问题描述
我是注释风格的 Spring Framework 的新手,并且配置了一个简单的 bean,但无法让 @ComponentScan 工作。bean 和应用程序都在同一个包中。
package springdemo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Pet {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Bean
public Pet fido() {
Pet p = new Pet();
p.setName("fido");
return p;
}
}
和应用程序:
package springdemo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class BeanApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.refresh();
ctx.start();
Pet dog = (Pet) ctx.getBean("fido");
System.out.println(dog.getName());
ctx.stop();
}
}
当我运行它时,应用程序找不到 bean(我假设组件扫描也拾取 bean...):
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'fido' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:772)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1212)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
at springmvc.bean.BeanApplication.main(BeanApplication.java:15)
我可以通过 scan() 方法让组件扫描在代码中工作,但不能通过注释。
解决方案
您需要传递一个配置类,在其中提供将由 Spring 容器管理的 bean。
没有 Spring Boot 的经典 Spring 应用示例
public class SpringApplication {
public static void main(String[] args){
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Pet dog = (Pet)ctx.getBean("fido");
System.out.println(dog.getName());
}
}
@Configuration
class AppConfig {
@Bean
public Pet fido() {
Pet p = new Pet();
p.setName("fido");
return p;
}
}
class Pet {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
春季启动示例:
@SpringBootApplication
public class SpringApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(SpringApplication.class, args);
Pet dog = (Pet) ctx.getBean("fido");
System.out.println(dog.getName());
}
}
@Configuration
class AppConfig {
@Bean
public Pet fido() {
Pet p = new Pet();
p.setName("fido");
return p;
}
}
class Pet {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
推荐阅读
- javascript - 球用延迟画布跟随鼠标
- react-native - 无法使用 react-navigation V3 设置深度链接
- pdf - 使用 Itext 链接 Portable Collection 的 pdf
- typescript - Nest.js - 除了ParamDecorator,还有另一种获取请求/正文的方法吗?
- javascript - 角度 7 可观察数组过滤错误
- powershell - PowerShell - 从另一个变量更新变量值
- c - 为什么卷积函数不打印?
- angular - 是 expect(...).toBe 解决承诺还是我需要等待它们?
- javascript - 在显示之前预加载多个图像
- r - 比较 2 个数据帧中 ID 的字符变量