SpringBoot中的依赖注入

时间:2018-04-11 22:07:42

标签: java spring spring-boot

我有一个控制器

@Controller
public class AppController{

   @Autowired
   private IDemoApplicationService service;
   //more code

}

服务

@Service("service")
public class DemoApplicationServiceImpl implements IDemoApplicationService{
    @Override
public void createEmployee(Employee employee){  
    try {
        dao.insertEmployee(employee);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public String updateEmployee(Employee employee, int id) {
    dao.updateEmployee(employee, id);
    return "redirect:/employees";
}

@Override
public String deleteEmployee(int id) {
    dao.deleteEmployee(id);
    return "redirect:/employees";
}

@Override
public String getEmployees(Model model) {
    model.addAttribute("employees", dao.getEmployees());
    return "employees";
}

@Override
public Employee findById(int id) {
    return dao.findById(id);
}
}

服务接口

public interface IDemoApplicationService {

}

我想在我的控制器中使用@Autowired来使用该服务,但是当我运行该应用程序时,我收到以下错误

  

org.springframework.beans.factory.BeanCreationException:错误   创建名为'demoApplication'的bean:注入自动装配   依赖失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:不能   autowire字段:private services.IDemoApplicationService   controllers.DemoApplication.service;嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   找到的类型为[services.IDemoApplicationService]的bean   依赖:预计至少有1个bean有资格成为autowire   这种依赖的候选人。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

任何人都可以告诉我该怎么做才能让它发挥作用?

由于

2 个答案:

答案 0 :(得分:1)

如果你看一下@SpringBootApplication,它包含很多另外一个Spring的注释

其中一些:

1)@Configuration

2)@ComponentScan

在@SpringBootApplication中,您可以路径参数:

@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    public String[] scanBasePackages() default {};

正如你可以看到@ComponentScan的别名是知道哪些包要扫描用@Component调用的类或者如果你不提供这个参数的子标注@Service @Repository,Spring会扫描主包其中使用SpringBootApplication注释的类是lokated。

很可能您的服务位于不同的包中

答案 1 :(得分:0)

您的DemoApplication是您的申请启动课程。

@SpringBootApplication
public class DemoApplication {

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

然后你需要一个单独的控制器文件,如下所示:

@Controller
public class AppController {

    @Autowired
    private IDemoApplicationService service;
    //more code
}

@Service("service")
public class DemoApplicationServiceImpl implements IDemoApplicationService{

}

为什么需要进行以上更改:

@SpringBootApplication相当于使用三个单独的注释,即@EnableAutoConfiguration@ComponentScan@Configuration。您可以在Using Spring Boot Docs.了解详情。

当您在@Controller之前提供@SpringBootApplication时,@Configuration部分没有机会在上下文中注册bean,因此您收到了上述错误。