Spring Boot
Add another module components to context
Scan components in all packages of a module
Supposing that the SecondApplicationConfiguration is the secondapplication
application root Configuration class:
@SpringBootApplication
@Import(SecondApplicationConfiguration.class)
@EntityScan("secondapplication.some.package.entities")
public class FirstApplication {
...
}
In this way, all the beans detected by the SecondApplicationConfiguration specified component scan will be registered in the FirstApplication context.
This approach is simple, but can create some hidden problems. For example, if there is a component in secondapplication
which has dependencies in thirdapplication
, we will have to add the ThirdApplicationConfiguration.class to @Import, even if the secondapplication
component with such dependency is not used by the firstapplication
. In order to avoid this problem, we can use a customized Configuration class precisely specifying the packages/class to add to the firstapplication
context.
Scan components only in certain packages
A Configuration class specifying the secondapplication
packages/classes to add to the application context:
@Configuration
@ComponentScan(
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Configuration.class),
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = SpringBootApplication.class),
@ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "secondapplication.some.package.excluded.*"),
},
basePackages = "secondapplication.some.package")
@EnableJpaRepositories("secondapplication.some.package.repositories")
@EntityScan("secondapplication.some.package.entities")
public class MyConfiguration {
}
Explanation:
secondapplication.some.package
is thesecondapplication
root package containing either a SecondApplicationConfiguration or a SecondApplication class,- @ComponentScan specifies the
secondapplication
basePackage to start the components scan from, as well as a list of excludeFilters to filter out the scanned packages/classes, secondapplication
root application class with @SpringBootApplication annotation and root configuration class with @Configuration annotation should be excluded from the component scan. If we do not do this, either of them will add all thesecondapplication
components to the context no matter which other excludeFilters are present in the @ComponentScan,FilterType.ASPECTJ
component scan filter with patternsecondapplication.some.package.excluded.*
excludes all the packages and classes of thesecondapplication.some.package
package,@EnableJpaRepositories
specifies a base package containing the repositories,@EntityScan
specifies a base package containing the entities.
Import the MyConfiguration class in the firstapplication
@SpringBootApplication class:
@SpringBootApplication
@Import(MyConfiguration.class)
public class FirstApplication {
...
}