2017-07-02 75 views
0

我在学习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

+0

包裹很重要。请给他们看。 – davidxxx

+0

用@Service注释TestBeanImpl – VelNaga

+0

据我所知,@Service是自动配置。这个注解应该被我放入ConsoleSpringConfig的基于Java的配置替代。 反正试了,不行 – CodingMonkey

回答

1

默认情况下,@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都应该位于弹簧启动应用程序的基础包或子包中,以避免这种问题。

+0

即使移动应用程序一个包 - it.myapp.console - 它给我同样的错误 我也试着添加ComponentScan注释来解决这个问题,因为它应该允许从外部目录加载bean – CodingMonkey

+0

不要移动到'it.myapp.console',而是'it.myapp.console.spring'。它适用于包和子包而不是父包。 – davidxxx

0

问题解决了通过改变

SpringApplication app = new SpringApplication(MainMenu.class); 

SpringApplication app = new SpringApplication(MainMenu.class, MailchimpConsoleSpringConfig.class); 

我承认我复制这条线,它适用于我的类名,而不反省自己的语义。它列出了要在应用程序中加载的第一个bean,并且Java config bean必须位于该列表当然:)

无论如何感谢大家的帮助!