Spring引导和配置文件
我在学习Spring,尤其是Spring Boot。Spring引导和配置文件
我想做一些基本的注射,但我没有做一个基本的注射。这可能是一个非常愚蠢的错误,但我不能算出它 - 可能是因为我刚睡醒:)
这是我的应用程序类
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类,所以我想我缺少一些方法来声明应该在那里找到配置。
感谢您的帮助! Lorenzo
默认情况下,@SpringBootApplication
允许触发使用声明此注释的类的包的自动配置和组件扫描。
当然,您可以通过指定注释的scanBasePackages
属性来更改它。
就你而言,你在it.myapp.console.spring.Application
类中声明了注释。
所以只有在包中声明的bean和它的子包将是Spring的扫描器。
但TestBeanImpl
没有位于这个基本包:
package it.myapp.console.test;
public class TestBeanImpl implements TestBean {
public String doTest() {
return "aaa";
}
}
所以,它不会被扫描。
为了解决您的问题,例如,您可以移动TestBeanImpl
类中的it.myapp.console.spring.test
类。
作为一般建议,所有的bean都应该位于弹簧启动应用程序的基础包或子包中,以避免这种问题。
即使移动应用程序一个包 - it.myapp.console - 它给我同样的错误 我也试着添加ComponentScan注释来解决这个问题,因为它应该允许从外部目录加载bean – CodingMonkey
不要移动到'it.myapp.console',而是'it.myapp.console.spring'。它适用于包和子包而不是父包。 – davidxxx
问题解决了通过改变
SpringApplication app = new SpringApplication(MainMenu.class);
到
SpringApplication app = new SpringApplication(MainMenu.class, MailchimpConsoleSpringConfig.class);
我承认我复制这条线,它适用于我的类名,而不反省自己的语义。它列出了要在应用程序中加载的第一个bean,并且Java config bean必须位于该列表当然:)
无论如何感谢大家的帮助!
包裹很重要。请给他们看。 – davidxxx
用@Service注释TestBeanImpl – VelNaga
据我所知,@Service是自动配置。这个注解应该被我放入ConsoleSpringConfig的基于Java的配置替代。 反正试了,不行 – CodingMonkey