2017-06-13 102 views
0

我在@SpringBootApplication類中放置了多個@Bean方法來創建所需的bean。除了一個以外,他們都運行。一個Bean方法永遠不會運行,因此,相應的類(它被註釋爲Service)會投訴異常:org.springframework.beans.factory.NoSuchBeanDefinitionException春天不叫@Bean方法

任何一個Bean方法在同一類中的其他方法不會運行的任何原因?

Application.java中的方法haproxyService永遠不會調用,而consulService不會被調用。

// Application.java: 
@SpringBootApplication 
public class Application { 
    //Config for services 
    //Consul 
    String consulPath = "/usr/local/bin/com.thomas.Oo.consul.consul"; 
    String consulConfPath = "/root/Documents/consulProto/web.json"; 

    //HAProxy 
    String haproxyPath = "/usr/local/bin/haproxy"; 
    String haproxyConfFilePath = "/root/Documents/consulProto/haproxy.conf"; 

    public static void main(String[] args){ 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public ConsulService consulService(){ 
     return new ConsulService(consulPath, consulConfPath); 
    } 

    @Bean 
    public HAProxyService haProxyService(){ 
     return new HAProxyService(haproxyPath, haproxyConfFilePath); 
    } 
} 


// ConsulService.java 
@Service 
public class ConsulService extends BaseService { 
    String executablePath; 
    String confFilePath; 

    public ConsulService(String consulPath, String confFilePath) { 
     this.executablePath = consulPath; 
     this.confFilePath = confFilePath; 
    } 
} 


// HAProxyService.java 
@Service 
public class HAProxyService extends BaseService { 
    String executablePath; 
    String confFilePath; 

    public HAProxyService(String executablePath, String confFilePath) { 
     this.executablePath = executablePath; 
     this.confFilePath = confFilePath; 
    } 
} 
+1

當我從違規類中刪除@Service時,現在魔術般地調用了Bean方法.......發生了什麼 –

+3

您將不得不顯示一些代碼。沒有人可以肯定地猜到這一點。 – Todd

+0

這是一個要點:https://gist.github.com/thomas-oo/7d129f4a042fd87a8ed33f87a8dad396 Application.java中的方法,haProxyService永遠不會調用,而consulService不會被調用。當我從HAProxyService中刪除@Service時,bean方法現在被調用..但我的問題仍未解決 –

回答

4

刪除@Service註釋。

您正在將手動創建豆漿的工作與@Bean和類別註釋(@Service,@Controller,@Component等)混合以進行組件掃描。這導致重複的實例。否則,如果您想要離開@Service s而不想手動創建bean,則應該使用@Bean註釋刪除方法,並使用@Value註釋注入字符串值。

例子:

// Application.java: 
@SpringBootApplication 
public class Application { 
    public static void main(String[] args){ 
     SpringApplication.run(Application.class, args); 
    } 
} 

// HAProxyService.java 
@Service 
public class HAProxyService extends BaseService { 

    @Value("/usr/local/bin/haproxy") 
    private String executablePath; 
    @Value("/root/Documents/consulProto/haproxy.conf") 
    private String confFilePath; 

} 

// ConsulService.java 
@Service 
public class ConsulService extends BaseService { 

    @Value("/usr/local/bin/com.thomas.Oo.consul.consul") 
    private String executablePath; 
    @Value("/root/Documents/consulProto/web.json") 
    private String confFilePath; 

} 

這樣做後我建議你閱讀有關externalizing your configuration,這樣你就可以輕易改變他們無需重新編譯應用程序定義application.properties文件和效益這些字符串。