我正在尝试使用Spring创建一个三层应用程序,view
,logic
,data
,或多或少。 view
取决于logic
,这取决于data
。
如何在view
项目中配置Spring应用程序,以便能够解析依赖关系图?
例如:
在view
图层中:
@Controller
public class SomeView {
private final SomeService someService;
@Autowired
public SomeView(SomeService someService) {
this.someService = someService;
}
}
@Configuration
@EnableAutoConfiguration
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在logic
图层中:
@Component
public class SomeService {
private final SomeData someData;
@Autowired
public SomeService(SomeData someData){
this.someData = someData;
}
}
在data
图层中:
@Component
public class SomeData {
}
此配置无法启动,因为SomeService
无法解析SomeData
,因为SomeData
层中view
未扫描Application.java
< / p>
答案 0 :(得分:1)
使用@SpringBootApplication
时,Spring启动使用默认值。如果您查看@SpringBootApplication定义,您会看到:
许多Spring Boot开发人员总是使用@Configuration,@ EnableAutoConfiguration和@ComponentScan注释其主类。由于这些注释经常一起使用(特别是如果你遵循上面的最佳实践),Spring Boot提供了一个方便的@SpringBootApplication替代方案。
@SpringBootApplication注释相当于使用@Configuration,@ EnableAutoConfiguration和@ComponentScan及其默认属性:[...]
这意味着:
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
此外,这意味着当使用@ComponentScan
的默认值时,您的包裹结构如下:
如果不遵循此结构,您应该告诉@ComponentScan
包裹在哪里找到组件:
示例1:
@Configuration
@EnableAutoConfiguration
@ComponentScan({"com.my.package.controller","com.my.package.domain"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
例2:
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = {SomeService.class, SomeData.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
另外,我建议您检查一下guide如何在Spring Boot应用程序中构建代码。