Reputation: 347
I’m attempting to break my project up into three modules: core, admin and user so that I can share common code via core. The problem is that I can’t get Spring to pickup the autowired beans across different main packages, when I have everything in the same package it works.
In the com.mickeycorp.core package I have the models, services, etc that I want the admin and user modules to use. In com.mickeycorp.admin is the my WebApplicationStarter (extends SpringBootServletInitializer) where I’ve got:
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfiguration.class);
return application.sources(WebApplicationStarter.class);
}
Which I believe should pickup my configuration class where I have the following:
@Configuration
@ComponentScan("com.mickeycorp")
public class SpringConfiguration {
}
Clearly I’ve misunderstood something.. I thought that setting ComponentScan would have Spring scan through packages under com.mickeycorp for component annotations?
Upvotes: 7
Views: 5806
Reputation: 351
@ComponentScan
annotation has to be used.
Please refer the Spring documentation which says
Either
basePackageClasses()
orbasePackages()
(or its aliasvalue()
) may be specified to define specific packages to scan.@ComponentScan(basePackages={"package1","package2"})
Upvotes: 2
Reputation: 347
I was on the right track.. adding @ComponentScan
was only a third of the way there and is correct but it doesn't configure Spring to scan for other types - it only covers @Component
@Repository
, @Service
, or @Controller
annotations. I had to add the following to pickup @Entity
and @Repository
:
@EntityScan("com.mickeycorp.core")
@EnableJpaRepositories("com.mickeycorp.core")
Overriding SpringApplicationBuilder
is also unnecessary in this case as the SpringConfiguration
class is automatically picked up.
References:
Spring Docs: EnableJpaRepositories
Upvotes: 6