2017-07-02 73 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必須位於該列表當然:)

無論如何感謝大家的幫助!