我正在学习Spring,尤其是Spring Boot。
我正在尝试做一些基本的注射,但我没有做一个基本注射。这可能是一个非常愚蠢的错误,但我无法弄清楚 - 可能是因为我刚刚醒来:)
这是我的应用程序类
package it.myapp.console.spring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import it.myapp.console.menus.MainMenu;
@SpringBootApplication
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MainMenu.class);
app.run(args);
}
}
这是MainMenu类
package it.myapp.console.menus;
import javax.annotation.Resource;
import org.springframework.boot.CommandLineRunner;
import it.myapp.console.test.TestBean;
public class MainMenu implements CommandLineRunner {
@Resource
private TestBean testBean;
public void run(String... strings) throws Exception {
System.out.println(testBean.doTest());
}
}
这是我的配置类
package it.myapp.console.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import it.myapp.console.test.TestBean;
import it.myapp.console.test.TestBeanImpl;
@Configuration
public class ConsoleSpringConfig {
@Bean
public TestBean getTest() {
return new TestBeanImpl();
}
}
TestBean和TestBeanImpl非常简单
package it.myapp.console.test;
public interface TestBean {
String doTest();
}
和
package it.myapp.console.test;
public class TestBeanImpl implements TestBean {
public String doTest() {
return "aaa";
}
}
我收到的是一个非常悲伤的
***************************
APPLICATION FAILED TO START
***************************
Description:
A component required a bean of type '...TestBean' that could not be found.
Action:
Consider defining a bean of type '...TestBean' in your configuration.
我发誓我已经看过很多导游,他们似乎自动完成所有事情,但我显然错过了最后一点。
我尝试使用--debug选项启动应用程序,但它没有以任何方式提及ConsoleSpringConfig类,所以我想我错过了某种方式来声明该配置应该在那里找到。
感谢您的帮助! 洛伦佐
答案 0 :(得分:1)
默认情况下,@SpringBootApplication
允许触发使用声明此注释的类的包的自动配置和组件扫描。
当然,您可以通过指定注释的scanBasePackages
属性来更改它。
在您的情况下,您在it.myapp.console.spring.Application
类中声明注释。
因此,只有在it.myapp.console.spring
包及其子包中声明的bean才会被Spring扫描。
但TestBeanImpl
不在此基础包中:
package it.myapp.console.test;
public class TestBeanImpl implements TestBean {
public String doTest() {
return "aaa";
}
}
因此,它不会被扫描。
要解决您的问题,您可以移动TestBeanImpl
中的it.myapp.console.spring.test
课程。例如。
作为一般建议,你所有的豆子都应该放在 Spring Boot Application的基础包或子包,以避免这种问题。
答案 1 :(得分:0)
通过更改
解决了问题 SpringApplication app = new SpringApplication(MainMenu.class);
到
SpringApplication app = new SpringApplication(MainMenu.class, MailchimpConsoleSpringConfig.class);
我承认我复制了这一行并将其改编为我的班级名称,而没有反映其语义。它列出了要在应用程序中加载的第一个bean,并且Java配置bean当然必须在该列表中:)
感谢大家的帮助!