Search code examples
springspring-bootautowiredcomponent-scan

ComponentScan and Autowired not working for dependent Spring project?


I have two projects A and B. Both are built with Maven, and project A has a Maven dependency to project B. Both project have a class with @Configuration annotation where I define @Beans.

I have beans in project A, from both projects. If I use the @Autowired annotation in project A of a bean that is defined in same project, the autowiring works. However, if I use the @Autowired annotation in project A of a bean from project B, I will get an exception.

What does this mean? How can I autowire a bean in project A, that is defined in project B?


Solution

  • This is normally an issue with the base classpath on ComponentScan.

    If you for example have the following base packages

    com.myproject.a
    

    and

    com.myproject.b
    

    in your project A and B respectively, and you're using SpringBoot with the main class

    package com.myproject.a
    
    @Configuration 
    @EnableAutoConfiguration 
    @ComponentScan
    class MyApp {
        // Some public static void main ... 
    }
    

    it will only find your classes in the package com.myproject.a and it's children.

    To solve this issue you must enhance the @ComponentScan in a way that it scans both package structures, eg.

    package com.myproject.a
    
    @Configuration 
    @EnableAutoConfiguration 
    @ComponentScan(basePackages = {"com.myproject.a", "com.myproject.b"} 
    // or basePackages = "com.myproject" in this example
    class MyApp {
        // Some public static void main ... 
    }