Spring: Properly setup @ComponentScan

27,977

Solution 1

@Configuration is also a candidate for component scan, so you can scan all the beans in RmiContext and all controllers in your controller package by:

@Configuration
@ComponentScan(basePackages = {"org.example.controllers", "package.of.RmiContext"})
public class MainContext {
}

--edit--

@Configuration is a candidate for component scan, here is the test case that works in my pc:

package scan.controllers;
@Controller
public class ExampleController {
}

package scan;
public interface RMIService {
}

package scan;
@Configuration
public class RmiContext {
    @Bean
    public RmiProxyFactoryBean service() {
        RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
        rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
        rmiProxy.setServiceInterface(RMIService.class);
        rmiProxy.setLookupStubOnStartup(false);
        return rmiProxy;
    }
}

package scan;
@Configuration
//MainContext will auto scan RmiContext in package scan and all controllers in package scan.controllers
@ComponentScan(basePackages = {"scan", "scan.controllers"})
public class MainContext {
}

package scan;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={MainContext.class})
public class TestContext {

    @Autowired private RMIService rmi;
    @Autowired private ExampleController controller;

    @Test
    public void test() {
        //both controller and rmi service are autowired as expected
        assertNotNull(controller);
        assertNotNull(rmi);
    }
}

Solution 2

May be you could try using the base packages of your classes (RMI, Controller):


@ComponentScan(basePackages = {"your controller package", "your rmi package"})

If the RMI classes package is different than controller then they will fail to instantiate by spring.

Share:
27,977
TheKojuEffect
Author by

TheKojuEffect

#Programmer #Developer #Engineer

Updated on April 15, 2020

Comments

  • TheKojuEffect
    TheKojuEffect about 4 years

    I have following set up for my Spring Application Context.

    
    @Configuration
    public class RmiContext {
    @Bean
        public RmiProxyFactoryBean service() {
            RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
            rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
            rmiProxy.setServiceInterface(Service.class);
            return rmiProxy;
        }
    }
    

    
    @Configuration
    public class LocalContext {
    @Bean
        public Controller Controller() {
            return new ControllerImpl();
        }
    }
    

    
    @Configuration
    @Import({RmiContext.class, LocalContext.class})
    public class MainContext {

    }

    The above setup works fine, but I want to enable @ComponentScan annotating Controllers with @Component as there are many Controllers in my application which is tedious when declared one by one using @Bean.

    
    @Configuration
    @ComponentScan(basePackageClasses = {Controller.class})
    public class LocalContext {
        /* ... */
    }
    
    The problem is that when I do @ComponentScan(basePackageClasses = {Controller.class}), the previously fine working RmiProxyFactoryBean are not recognized or can't be created.

    So, How do I configure my MainContext so that both beans via RMI and local beans are created?