我有一个控制器
@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(所需=真)}
任何人都可以告诉我该怎么做才能让它发挥作用?
由于
答案 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,因此您收到了上述错误。