Spring: Properly setup @ComponentScan
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.
Comments
-
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
annotatingController
s with@Component
as there are manyController
s in my application which is tedious when declared one by one using@Bean
.
The problem is that when I do@Configuration @ComponentScan(basePackageClasses = {Controller.class}) public class LocalContext { /* ... */ }
@ComponentScan(basePackageClasses = {Controller.class})
, the previously fine workingRmiProxyFactoryBean
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?