来自2个包的@ComponentScan

时间:2017-02-15 14:08:49

标签: java spring spring-boot configuration component-scan

我有2个项目,主要的春季启动项目和第二个春季项目,其中包含@Contollers,@ Services等。

我尝试在主项目中使用这些服务。我看到类似的问题,例如hereherehere以及其他许多问题,但它对我不起作用

1)如果我刚刚

@SpringBootApplication
public class App { ... }

然后它无法编译,因为无法从第二个项目中找到服务

2)如果我尝试扫描第二个包

@SpringBootApplication
@ComponentScan("secondPackage")
public class App {}

然后应用程序启动没有错误,但控制器映射根本不起作用。两个项目的映射都无法解决。

3)然后我尝试从第二个包中排除控制器,因为我不需要它们,映射仍然不起作用

@ComponentScan(basePackages="secondPackage", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})

4)然后我尝试扫描特定服务,但在这种情况下,其他资源不可用,我必须包括很多路径

@ComponentScan({"first package", "second package"})

5)最后我尝试制作2个配置文件

@Configuration
@ComponentScan(basePackages = {"mainPackage"})
public class MainConfiguration {

}

@Configuration
@ComponentScan(basePackages="secondPackage", 
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class SecondConfiguration {

}

但我没有找到示例,我如何在SpringApplication.run(App.class,args)之前准备上下文;然后使用我的上下文运行应用程序。喜欢

ApplicationContext myContext = new AnnotationConfigApplicationContext(OrderStatusConfiguration.class, ShopRuServicesConfiguration.class);
SpringApplication.run(App.class, myContext, args);

所以请给我一个建议,为什么映射不起作用或者我应该如何从第二个项目中正确地自动服务!

我感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

1)空注释会触发默认组件扫描。这是从带注释的类

的包开始的
@SpringBootApplication
public class App { ... }

比你说它甚至没有编译。

这意味着,您的spring配置按名称引用了一些不在类路径中的类。

2)如果添加@ComponentScan,则不会进行1)的默认组件扫描,而是仅从' secondPackage'

开始扫描
@SpringBootApplication
@ComponentScan("secondPackage")
public class App {}

比你写的

  

映射根本不起作用

这可能意味着控制器根本不包含在弹簧配置中。

要解决此问题,您可以尝试

@SpringBootApplication
@ComponentScan({"package of App","secondPackage"})
public class App {}

可能会给你预期的结果2)

如果这个doe不起作用,我建议在引用的项目中创建java配置类,这些类只配置你在应用程序中需要的东西。

使用@Import导入这些配置。 这样,您可以在应用程序中引用配置类,并验证是否正确配置了类路径。

如果您的应用仍然没有正确配置服务和映射,您可以微调引用的配置,直到您获得所需的弹簧上下文。