Spring启动和配置文件

时间:2017-07-02 10:00:50

标签: spring-boot autowired spring-java-config

我正在学习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类,所以我想我错过了某种方式来声明该配置应该在那里找到。

感谢您的帮助! 洛伦佐

2 个答案:

答案 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当然必须在该列表中:)

感谢大家的帮助!