多层Spring应用程序依赖性解析

时间:2016-06-01 16:54:00

标签: java spring spring-boot

我正在尝试使用Spring创建一个三层应用程序,viewlogicdata,或多或少。 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>

1 个答案:

答案 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的默认值时,您的包裹结构如下:

  • com.example.model - &gt;你的实体
  • com.example.repositoriy - &gt;您的存储库
  • com.example.controller - &gt;控制器
  • com.example - &gt; MainApplication类

如果不遵循此结构,您应该告诉@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应用程序中构建代码。